2014-12-22 3 views
0

У меня проблема. Я хотел документировать мою разработку инструмента, поэтому вместо того, чтобы mspaint-date даты поверх скриншота, я хотел, чтобы имя окна несло данные даты и времени. Но вместо строки у меня есть только китайские персонажи.CreateWindowEx показывает китайскую тарабарщину вместо исходного текста

gibberish

Вот мой код, где я хочу, чтобы присвоить строку CreateWindowEx():

char *wndName = "Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")\0"; 

hWnd = CreateWindowEx(NULL, 
         L"WindowClass", 
         (LPCWSTR)wndName, 
         WS_OVERLAPPEDWINDOW, 
         300, 
         300, 
         wr.right - wr.left, 
         wr.bottom - wr.top, 
         NULL, 
         NULL, 
         hInstance, 
         NULL); 

EDIT: Ребята, я ценю ваши ответы, но все из них дает мне эту

Error 29 error C2308: concatenating mismatched strings 

и только несколько рабочий материал был удален еще ответ, но он дал мне это:

enter image description here

он использовал этот код:

char title[256]; 
sprintf(title, "Asphyx V0.01 (Build Date: %s - %s)", __DATE__, __TIME__); 

hWnd = CreateWindowEx(NULL, 
         L"WindowClass", 
         title, 
         WS_OVERLAPPEDWINDOW, 
         300, 
         300, 
         wr.right - wr.left, 
         wr.bottom - wr.top, 
         NULL, 
         NULL, 
         hInstance, 
         NULL); 
+3

Casting плохо, mmkay. –

+0

mmkay mister mackey – Citrus

+0

также плюс один для ссылки на юг парка: D – Citrus

ответ

4

В соответствии со стандартом, если одна из строк имеет префикс кодирования, остальные строки, которые не будут рассматриваться как имеющие одинаковый префикс.

Это не относится к Visual Studio. Это ошибка.

Вы должны использовать широкую строку и префикс каждую строку буквальной с L включая макросы:

#define WSTR2(s) L##s 
#define WSTR(s) WSTR2(s) 

wchar_t *wndName = L"Asphyx V0.01" WSTR(__DATE__) L" " WSTR(__TIME__) L")"; 
+0

это все еще дает ошибку конкатенации несогласованных строк – Citrus

+0

«Мне тоже нужен L». –

+0

@JonathanPotter D0h. Tnx. – 2501

1

проблема в том, что вы используете приведение для преобразования полукокса в LPCWSTR, заменить

char *wndName = "Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")\0"; 

в

wchar_t *wndName = L"Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")"; 

сейчас вам не нужно больше бросать во втором параметре C reateWindowEx.

wchar_t *wndName = L"Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")"; 

hWnd = CreateWindowEx(NULL, 
        L"WindowClass", 
        wndName, 
        WS_OVERLAPPEDWINDOW, 
        300, 
        300, 
        wr.right - wr.left, 
        wr.bottom - wr.top, 
        NULL, 
        NULL, 
        hInstance, 
        NULL); 
+1

Это не скомпилируется, потому что '__DATE__' сам по себе расширяет строку' char * '. –

+1

@JonathanPotter: вы уверены, что он не просто расширяется до строки * string *? – usr2564301

+1

@Jongware Это работает, потому что: http://stackoverflow.com/questions/5179384/what-happens-with-adjacent-string-literal-concatenation-when-there-is-a-modifier Однако это не определено, только c99 и более новые версии определили это: https://www.securecoding.cert.org/confluence/display/seccode/STR10-C.+Do+not+concatenate+different+type+of+string+literals – 2501