afro228offical Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 Приветь Как использовать wcscat_s для динамического массива типа wchar_t . Или что использовать вместо wcscat_s ? int a = 100; int b = 10; wchar_t *wch = new wchar_t[a+b]; wcscat_s(wch, L" lalala"); delete[] wch; Тот код , что я скинул не работает Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 int a = 100; int b = 10; wchar_t *wch = new wchar_t[a+b]; wcscat_s(wch,a+b,reinterpret_cast<const wchar_t*>("1245")); delete[] wch; Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 8 минут назад, partoftheworlD сказал: int a = 100; int b = 10; wchar_t *wch = new wchar_t[a+b]; wcscat_s(wch,a+b,reinterpret_cast<const wchar_t*>("1245")); delete[] wch; Ошибку выдаёт... Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 (изменено) Только откомпилировал все нормально, Может у тебя студия шалит. Скрытый текст #include <Windows.h> int main() { int a = 100; int b = 10; wchar_t *wch = new wchar_t[a + b]; wcscat_s(wch, a + b, reinterpret_cast<const wchar_t*>("1245")); delete[] wch; } 1>------ Сборка начата: проект: test, Конфигурация: Release Win32 ------ 1> main.cpp 1> Создание кода 1> 0 of 1 functions ( 0.0%) were compiled, the rest were copied from previous compilation. 1> 0 functions were new in current compilation 1> 0 functions had inline decision re-evaluated but remain unchanged 1> Создание кода завершено 1> test.vcxproj -> C:\Users\p\Documents\Visual Studio 2015\Projects\test\Release\test.exe 1> test.vcxproj -> C:\Users\p\Documents\Visual Studio 2015\Projects\test\Release\test.pdb (Full PDB) ========== Сборка: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ========== Изменено 8 июля, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 (изменено) Процедура assert обычно используется для обнаружения логических ошибок в программе, ставь бряк и отлавливай ошибку. Где-то баг в коде. Изменено 8 июля, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 Короче , как сделать так , чтобы программа рассчитывала место в символах под (ProcInfo.th32ProcessID+ProcInfo.szExeFile) создавался массив из wchar_t или WCHAR и туда записывались ProcInfo.th32ProcessID и " | " и ProcInfo.szExeFile ? Вот так вот у меня сейчас: Скрытый текст wchar_t wch[260]; // место под (ProcInfo.th32ProcessID+ProcInfo.szExeFile) _ultow_s(ProcInfo.th32ProcessID, wch, 10); // перевод из типа DWORD ProcInfo.th32ProcessID в тип wchar_t wcscat_s(wch, L" | "); //запись ещё " | " в массив wch wcscat_s(wch, ProcInfo.szExeFile);//запись ещё ProcInfo.szExeFile в массив wch SendMessage(hcom, LB_ADDSTRING, 0, (LPARAM)(wch)); вывод в listbox Чтобы можно было менять размер массива , он должен быть динамическим. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 (изменено) 56 минут назад, afro228offical сказал: Короче , как сделать так , чтобы программа рассчитывала место в символах под (ProcInfo.th32ProcessID+ProcInfo.szExeFile) создавался массив из wchar_t или WCHAR и туда записывались ProcInfo.th32ProcessID и " | " и ProcInfo.szExeFile ? PROCESSENTRY32 ProcessEntry; WCHAR zzzz[1024]; swprintf(zzzz,L"Id: %d Name: %s",ProcessEntry.th32ProcessID,ProcessEntry.szExeFile); для динам. буфера заюзай HeapAlloc/malloc, для размера возьми количество проц. * MAX_PATH или можешь получать каждый раз размер имени проц. (wcslen) а потом юзать HeapRealloc.. Изменено 8 июля, 2016 пользователем gmz Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 (изменено) Так мне чтобы лишних элементов массива не объявлять надо создавать массив чисто по размерам WCHAR zzzzz[кол-во_символов_из(ProcInfo.th32ProcessID) + кол-во_символов_из(ProcessEntry.szExeFile)]; А потом записывать туда сами ProcInfo.th32ProcessID и ProcessEntry.szExeFile Изменено 8 июля, 2016 пользователем afro228offical Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 1 минуту назад, afro228offical сказал: Так мне чтобы лишних элементов массива не объявлять а зачем он нужен? SendMessage и так заполнит список Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 20 минуты назад, gmz сказал: а зачем он нужен? SendMessage и так заполнит список Ну как бы блин. Надо чтобы было не 260 символов , как у меня . А ровно . Вот "4 | system" - 10 символов . И должно создаваться WCHAR zzzzz [10]; по размерам , не больше не меньше , а чтобы создать такой массив , он должен быть динамическим . Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 хмм можно без массива.. получаешь строку (которую выбрал юзер) через SendMessage LB_GETTEXT, снова конвертишь ИД -> swscanf или _wtoi - юзаешь ИД.. Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 (изменено) 38 минуты назад, gmz сказал: хмм можно без массива.. получаешь строку (которую выбрал юзер) через SendMessage LB_GETTEXT, снова конвертишь ИД -> swscanf или _wtoi - юзаешь ИД.. Мне бы как-то работать с динамическим массивом wchar_t. . Какую-то функцию типа wcscat_s но для динамического массива , и что-то типа _ultow_s , чтобы DWORD в wchar_t перевести. А id я буду загружать в вектор . И выбирать вектор с тем номером , который выбрал юзер в listbox Изменено 8 июля, 2016 пользователем afro228offical Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 Тестировалось в Code::Blocks Spoiler #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <tlhelp32.h> int get_kek_length(DWORD kek) { int count_of_numbers = 1; while (kek >= 10) { count_of_numbers++; kek /= 10; } return count_of_numbers; } int main() { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); int sizeOfWCHAR = sizeof(wchar_t); wchar_t *My_Little_String = NULL; wchar_t *forExeFile = NULL; int len_string = 0; int lenExeFile = 0; HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { lenExeFile = strlen(entry.szExeFile); len_string = get_kek_length(entry.th32ProcessID); // Длина твоего, как ТЫ выражаешься, DWORD'а len_string += 3; // Плюс длина твоей строки L" | " len_string += lenExeFile; // Плюс длина строки исполняемого файла len_string += sizeOfWCHAR; // Ну а эт прост так )0)))00 на всякий NULL символ в конец и т.п. // ----------------------- // Умножаем на sizeof(wchar_t) т.к. этот wchar_t не 1 байт My_Little_String = (wchar_t *) malloc(sizeOfWCHAR * len_string); // Выделили строку memset(My_Little_String, 0, sizeOfWCHAR * len_string); // От греха подальше сразу обнуляем область памяти // Особое внимание уделяю тому, что я добавляю всегда в конец sizeOfWCHAR для символа конца строки (а он равен NULL) forExeFile = (wchar_t *) malloc((sizeOfWCHAR * lenExeFile) + sizeOfWCHAR); // Выделили строку под имя ExeFile memset(forExeFile, 0, (sizeOfWCHAR * lenExeFile) + sizeOfWCHAR); // ----------------------- mbstowcs(forExeFile, entry.szExeFile, lenExeFile); // Конвертируем TCHAR в этот ваш бесполезный wchar_t swprintf(My_Little_String, L"%d - %s", entry.th32ProcessID, forExeFile); // ----------------------- wprintf( L"PROCESS INFO: [%s] (len of string = %d)\n", My_Little_String, len_string - sizeOfWCHAR // Из длины строки убираем символ конца строки ); // ----------------------- // Освободили наш мусор free(forExeFile); free(My_Little_String); } } CloseHandle(snapshot); return 0; } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 19 час назад, holy сказал: Тестировалось в Code::Blocks Респект , уважуха , Спасибо А вывести в MessageBox получится ? 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 8 minutes ago, afro228offical said: А вывести в MessageBox получится ? Используй MessageBoxW MessageBoxA для ASCII строк (там где символы 1 байт), MessageBoxW для UNICODE строк (там символы обычно 2 байта) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 (изменено) 4 минуты назад, holy сказал: Используй MessageBoxW MessageBoxA для ASCII строк (там где символы 1 байт), MessageBoxW для UNICODE строк (там символы обычно 2 байта) Чет трабл возник ... Тут lenExeFile = strlen( entry.szExeFile); Ошибка C2664 "size_t strlen(const char *)": невозможно преобразовать аргумент 1 из "WCHAR [260]" в "const char *" Изменено 8 июля, 2016 пользователем afro228offical Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 (изменено) 9 minutes ago, afro228offical said: невозможно преобразовать аргумент 1 из "WCHAR [260]" в "const char *" У меня, в CodeBlocks, в структуре переменная szExeFile имеет тип TCHAR, скорее всего в Visual Studio другой тип. Попробуй вместо strlen использовать wcslen (она для WCHAR) Изменено 8 июля, 2016 пользователем holy Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 Только что, holy сказал: У меня, в CodeBlocks, в структуре тип TCHAR, видимо в Visual Studio другой тип. Попробуй вместо strlen использовать wcslen (она для WCHAR) И тут чет mbstowcs(forExeFile, entry.szExeFile, lenExeFile); Ошибка C2664 "size_t mbstowcs(wchar_t *,const char *,size_t)": невозможно преобразовать аргумент 2 из "WCHAR [260]" в "const char *" prac c:\users\user\documents\visual studio 2015\projects\prac\prac\prac.cpp 58 Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 10 minutes ago, afro228offical said: невозможно преобразовать аргумент 2 из "WCHAR [260]" в "const char *" так как у тебя ExeFile уже имеет тип WCHAR то тебе уже ничего не надо делать, можешь все что связано с переменной forExeFile удалить, а строку swprintf(My_Little_String, L"%d - %s", entry.th32ProcessID, forExeFile); заменить на swprintf(My_Little_String, L"%d - %s", entry.th32ProcessID, entry.szExeFile); Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 8 июля, 2016 Автор Поделиться Опубликовано 8 июля, 2016 Ну эт жесть Ошибка C4996 'swprintf': function has been changed to conform with the ISO C standard, adding an extra character count parameter. To use the traditional Microsoft version, set _CRT_NON_CONFORMING_SWPRINTFS. Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 8 июля, 2016 Поделиться Опубликовано 8 июля, 2016 9 minutes ago, afro228offical said: Ну эт жесть Вообще-то все эти ошибки гуглятся... Столько лишних вопросов, попробуй сам гуглить. То что студии не нравится swprintf это я знаю, по этому и не люблю Visual Studio, слишком много на себя берет. Попробуй вторым параметром передать длину строки, т.е. swprintf(My_Little_String, len_string, L"%d - %s", entry.th32ProcessID, entry.szExeFile); Может поможет. Если нет, то загугли альтернативные функции. Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 9 июля, 2016 Автор Поделиться Опубликовано 9 июля, 2016 (изменено) Ладно , как вывести в listbox массив WE . Во что преобразовать надо ? wchar_t WE[] = L"SSS"; SendMessage(hcom, LB_ADDSTRING, 0, (LPARAM)(WE)); Изменено 9 июля, 2016 пользователем afro228offical Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 9 июля, 2016 Автор Поделиться Опубликовано 9 июля, 2016 Вернее вот так вот , как сделать ? wchar_t WE[] = L""; _ultow_s(ProcInfo.th32ProcessID, WE, 10); SendMessage(hcom, LB_ADDSTRING, 0, (LPARAM)(WE)); Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 9 июля, 2016 Автор Поделиться Опубликовано 9 июля, 2016 Как работать с WCHAR* wch = L""; или WCHAR wch[] = L""; или wchar_t* wch = L""; или wchar_t wch[] = L""; ? Как добавить к одной строке другую ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения