Вы пропустили один важный момент. Подпись функции говорит LPWSTR
не LPSTR
. Это означает, что функция ожидает (или должна ожидать) получить wchar_t[]
не char[]
. См. https://msdn.microsoft.com/en-us/library/cc230355.aspx.
Я имею в виду:
extern "C" int __stdcall calcW2(LPWSTR foo) <--- LP-W-STR
char foo[5000];
LPSTR lpfoo2 = foo; <--- LP-STR
calcW2(lpfoo2); <--- LP-STR passed into LP-W-STR ??
, которые не должны компилировать. Типы аргументов неверны.
Если вы изменили массив на wchar_t [], и он начинает сбой компиляции, то, скорее всего, у вас есть некоторая установка #UNICODE #defines. В WINAPI и т. Д. Многие функции имеют двойственные определения. Когда установлен флаг «UNICODE», они берут LPWSTR, но когда флаг очищается, заголовки переключают их на LPSTR. Поэтому, если вы видите, что это должен быть LPWSTR, и вы хотите, чтобы он был LPWSTR, и он настаивает на том, чтобы быть LPSTR, тогда вы либо испортили имена функций, либо флаг UNICODE (или заголовок, который у вас есть, просто неверен).
char и wchar_t отличаются. Упрощение, char - «singlebyte», а wchar_t - «twobyte». Оба используют '\ 0' в качестве маркера конца строки, но в wchar_t это на самом деле '\ 0 \ 0', так как это два байта на символ. Кроме того, в wchar_t [] простые данные ASCII не похожи на a|b|c|d|e|f
, это 0|a|0|b|0|c|0|d|0|e|0|f
, так как это два байта на символ. Поэтому strlen
не может корректно работать с 16-битными закодированными данными - он выбирает первый \ 0 из первого символа как конец строки. Наличие данных wchar_t, насильственно упакованных в char [], явно неверно или, по крайней мере, очень ошибочно и подвержено ошибкам.
Вот почему вы должны использовать вместо этого wchar_t*
вместо char*
.
Это общее правило. Для любой функции, работающей на char (strlen, strcat, strcmp, ..), вы должны найти соответствующую функцию w * (wstrlen, wstrcat, wstrcmp, ..). Иногда могут быть некоторые символы подчеркивания. Поиск документов. Не смешивайте типы символов. Теперь это просто байтовый массив. Для них есть семантика, и обычно, если некоторые типы называются по-разному, есть причина для этого.
Зачем вам нужно проверять длину? – juanchopanza