Перейти к содержанию

wcscat_s для динамического массива типа wchar_t.


Рекомендуемые сообщения

Приветь :D Как использовать 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;


Тот код , что я скинул не работает :(

Ссылка на комментарий
Поделиться на другие сайты

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;

 

Ошибку выдаёт...

Ссылка на комментарий
Поделиться на другие сайты

Только откомпилировал все нормально,  Может у тебя студия шалит.

Скрытый текст

#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 ==========

 

 

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

Процедура assert обычно используется для обнаружения логических ошибок в программе, ставь бряк и отлавливай ошибку. Где-то баг в коде.

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

Короче , как сделать так , чтобы программа рассчитывала место в символах под (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

 


Чтобы можно было менять размер массива , он должен быть динамическим.

Ссылка на комментарий
Поделиться на другие сайты

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..

 

Изменено пользователем gmz
Ссылка на комментарий
Поделиться на другие сайты

Так мне чтобы лишних элементов массива не объявлять надо создавать массив чисто по размерам WCHAR zzzzz[кол-во_символов_из(ProcInfo.th32ProcessID) + кол-во_символов_из(ProcessEntry.szExeFile)];
А потом записывать туда сами ProcInfo.th32ProcessID и ProcessEntry.szExeFile

Изменено пользователем afro228offical
Ссылка на комментарий
Поделиться на другие сайты

20 минуты назад, gmz сказал:

а зачем он нужен? SendMessage и так заполнит список

Ну как бы блин. Надо чтобы было не 260 символов , как у меня . А ровно . Вот "4 | system" - 10 символов . И должно создаваться  WCHAR zzzzz [10]; по размерам , не больше не меньше , а чтобы создать такой массив , он должен быть динамическим .

Ссылка на комментарий
Поделиться на другие сайты

38 минуты назад, gmz сказал:

хмм можно без массива.. получаешь строку (которую выбрал юзер) через SendMessage LB_GETTEXT, снова конвертишь ИД -> swscanf или _wtoi - юзаешь ИД..

 

Мне бы как-то работать с динамическим массивом wchar_t. . Какую-то функцию типа wcscat_s но для динамического массива , и что-то типа _ultow_s , чтобы DWORD в wchar_t перевести.
А id я буду загружать в вектор . И выбирать вектор с тем номером , который выбрал юзер в listbox

Изменено пользователем afro228offical
Ссылка на комментарий
Поделиться на другие сайты

Тестировалось в 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
Ссылка на комментарий
Поделиться на другие сайты

19 час назад, holy сказал:

Тестировалось в Code::Blocks

Респект , уважуха , Спасибо:) А вывести в MessageBox получится ? 

 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

8 minutes ago, afro228offical said:

А вывести в MessageBox получится ?

 

Используй MessageBoxW

 

MessageBoxA для ASCII строк (там где символы 1 байт), MessageBoxW для UNICODE строк (там символы обычно 2 байта)

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, holy сказал:

 

Используй MessageBoxW

 

MessageBoxA для ASCII строк (там где символы 1 байт), MessageBoxW для UNICODE строк (там символы обычно 2 байта)

Чет трабл возник ... 
Тут lenExeFile = strlen( entry.szExeFile);
Ошибка    C2664    "size_t strlen(const char *)": невозможно преобразовать аргумент 1 из "WCHAR [260]" в "const char *"

Изменено пользователем afro228offical
Ссылка на комментарий
Поделиться на другие сайты

9 minutes ago, afro228offical said:

невозможно преобразовать аргумент 1 из "WCHAR [260]" в "const char *"

 

У меня, в CodeBlocks, в структуре переменная szExeFile имеет тип TCHAR, скорее всего в Visual Studio другой тип.

Попробуй вместо strlen использовать wcslen (она для WCHAR)

Изменено пользователем holy
Ссылка на комментарий
Поделиться на другие сайты

Только что, 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
 

Ссылка на комментарий
Поделиться на другие сайты

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);
Ссылка на комментарий
Поделиться на другие сайты

Ну эт жесть
Ошибка    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.

Ссылка на комментарий
Поделиться на другие сайты

9 minutes ago, afro228offical said:

Ну эт жесть

 

Вообще-то все эти ошибки гуглятся...

Столько лишних вопросов, попробуй сам гуглить.

 

То что студии не нравится swprintf это я знаю, по этому и не люблю Visual Studio, слишком много на себя берет.

Попробуй вторым параметром передать длину строки, т.е.

swprintf(My_Little_String, len_string, L"%d - %s", entry.th32ProcessID, entry.szExeFile);

Может поможет. Если нет, то загугли альтернативные функции.

Ссылка на комментарий
Поделиться на другие сайты

Ладно , как вывести в listbox массив WE .  Во что преобразовать надо ?

wchar_t WE[] = L"SSS";
SendMessage(hcom, LB_ADDSTRING, 0, (LPARAM)(WE));

 

Изменено пользователем afro228offical
Ссылка на комментарий
Поделиться на другие сайты

Как работать с  WCHAR* wch = L""; или WCHAR wch[] = L""; или wchar_t* wch = L""; или wchar_t wch[] = L""; ? Как добавить к одной строке другую ?

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.