簡體   English   中英

在win32學校應用程序上構建c ++錯誤

[英]c++ build errors on win32 school application

我沒有用c ++編程很長時間,但需要為我的學校制作一個Win32應用程序。 老師幫助了我很多信息,但經過幾天的嘗試,我仍然被卡住了。

錯誤:

error C2440: '=' : cannot convert from 'const char [11]' to 'LPCWSTR'
error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [11]' to 'LPCWSTR'
error C2664: 'TextOutW' : cannot convert parameter 4 from 'char *' to 'LPCWSTR'
IntelliSense: argument of type "char *" is incompatible with parameter of type "LPCWSTR"

不知道所有其他的后綴是否正確,但我現在只得到那4個錯誤

cpp文件:

    /* Hoofdstuk 10, User Interface */
#include "Callback_NYCM.h"

// UI
int WINAPI WinMain(HINSTANCE thisInstance,HINSTANCE prevInstance,LPSTR lpCmdLine,int nShowCmd) 
{ 
    PAINTSTRUCT ps;
    HDC hdc;
    MSG msg;
    HWND hwnd;
    WNDCLASSEX wndclassex; //struct_WNDCLASSEX via windows.h    

    // toekenning
    wndclassex.cbSize = sizeof(WNDCLASSEX); 
    wndclassex.style = CS_HREDRAW | CS_VREDRAW;
    wndclassex.lpfnWndProc = WndProc;
    wndclassex.cbClsExtra = 0;
    wndclassex.cbWndExtra = 0;
    wndclassex.hInstance = thisInstance;
    wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclassex.hCursor = LoadCursor(thisInstance,IDC_ARROW);  
    wndclassex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wndclassex.lpszMenuName = NULL;  
    wndclassex.lpszClassName = "WNDCLASSEX"; 
    wndclassex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    // functie aanroep
    RegisterClassEx(&wndclassex);

// IfThen -> CreateWindows
    if(!(hwnd = CreateWindowEx(NULL,"WNDCLASSEX","Hoofdstuk 10",WS_OVERLAPPEDWINDOW 
        | WS_VISIBLE,50,50,650,300,NULL,NULL,thisInstance,NULL)))  
    {  
        return 0; 
    } 
// logische structuur
while(GetMessage(&msg, NULL, 0, 0))  
{  
    if(msg.message == WM_QUIT)    
        break;   
    TranslateMessage(&msg);   
    DispatchMessage(&msg);  
}  
return (int) msg.wParam; 
};

頭文件:

 /*Hoofdstuk 10, Deelnemer.h*/ 
//Declaratie 
class Deelnemer 
{ 
private: 
    char* nm; 
public: 

//Constructor 
Deelnemer(){
}
    //Methoden = prototype 
    void Deelnemer::Invoeren();
    char* Deelnemer::WeergevenNaam();
};  
//Implemenmtatie.Invoeren 
void Deelnemer::Invoeren() 
{
    nm = "Roy"; 
}  
//.Weergeven 
char* Deelnemer::WeergevenNaam()
{ 
    return nm;
}

callback_NYCM.h:

    /*Hoofdstuk 10, Callback_NYCM*/
#include "Windows.h"
#include "Deelnemer.h"  

// prototype
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam); 

//Implementatie 
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam) 
{  
    //Constructie  
    PAINTSTRUCT ps;
    HDC hdc;
    MSG msg;
    WNDCLASSEX wndclassex;
    // HWND hwnd;
    Deelnemer deelnemer1; 


    //UI   
    switch(message)
    {
    case WM_PAINT:    
        {     
            //Functieaanroep.Initialisatie     
            deelnemer1.Invoeren();          
            //.TextOut  
            TextOut(hdc,50,50,deelnemer1.WeergevenNaam(),     
            strlen(deelnemer1.WeergevenNaam()));     
            EndPaint(hwnd,&ps);     
            return 0;   
        }    
        break;
        case WM_DESTROY:    
            {     
                PostQuitMessage(0);     
                return 0;    
            }    
            break;   
        default:    
            {     
                return DefWindowProc(hwnd,message,wparam,lparam);    
            }    
            break; 
    }
    return 0;
}

我認為我的構造函數或類似的東西是錯的,我的返回值為char * Deelnemer :: WeergevenNaam()

有人可以解釋一下我的代碼中有什么問題所以我知道如何讓它工作嗎?

更新:

更新應用程序需要始終使用UNICODE字符串文字,即L“MyString”而不是“MyString”。 您還需要使用WCHAR / wchar_t代替char

但是我如何使用我的代碼執行此操作,有人可以幫忙嗎?

更新2:

這解決了很多錯誤!

但是我在這部分還有一些錯誤

Deelnemer deelnemer1;   
    switch(message)
    {
    case WM_PAINT:    
        {     
            //Functieaanroep.Initialisatie     
            deelnemer1.Invoeren();          
            //.TextOut  
        TextOut(hdc,50,50,deelnemer1.WeergevenNaam(),     
            strlen(deelnemer1.WeergevenNaam()));     
            EndPaint(hwnd,&ps);     
            return 0;   
        }

所以錯誤是在線的:deelnemer1.WeergevenNaam()

-TextOutW':無法將參數4從'char *'轉換為'LPCWSTR'

-IntelliSense:類型“char *”的參數與“LPCWSTR”類型的參數不兼容

更新3:

經過一些測試我發現了一個解決方案(就像你們下面說的那樣)但是現在我只剩下這個了: TextOut (hdc,50,50,deelnemer1.WeergevenNaam(), //在deelnemer1.weergevenNaam()上
錯誤C2664:'TextOutW':無法將參數4從'const char *'轉換為'LPCWSTR'

您的代碼編寫為ANSI編譯,但您的解決方案設置包括_UNICODE / UNICODE 您可以通過更改字符集 (在配置屬性常規節點上)從使用Unicode字符集使用多字節字符集或更新應用程序代碼(建議使用后者)來設置解決方案以使用ANSI編碼。

更新應用程序需要始終使用UNICODE字符串文字,即L"MyString"而不是"MyString" 您還需要使用WCHAR / wchar_t代替char (如果適用)並調用Windows API的寬版本。 對於許多API調用,存在一個寬端版本,最后有一個W ,例如CreateWindowExW 如果您使用的是標准C ++庫,您還需要確保使用需要字符編碼的UNICODE變體(例如std::wstring而不是std::string )。 其他信息可以在Visual C ++中的Text和Strings中找到。

關於這里發生了什么的更多背景:Windows API和Microsoft的CRT實現可用於使用ANSI / Multi-Byte字符集或UNICODE字符集編譯代碼。 為了支持兩種字符編碼,C / C ++預處理器根據是否定義了_UNICODEUNICODE預處理器符號,用特定的實現替換了相應的字符類型和API調用。

例如,調用CreateWindowEx將擴展為CreateWindowExACreateWindowExW 兩個實現都有不同的字符串參數參數類型(分別為char*wchar_t* )。 要使用ANSI / Multi-Byte編碼,調用將是CreateWindowExA(NULL,"WNDCLASSEX",...) 對於UNICODE,它看起來像CreateWindowExW(NULL,L"WNDCLASSEX",...)

要查看預處理器完成后代碼的樣子,可以使用/ P/ E編譯器開關(假設您使用的是Microsoft編譯器)。

注意:不要忘記閱讀絕對最低每個軟件開發人員,絕對必須知道Unicode和字符集(沒有借口!)

簡單的答案 - 沒有解釋原因

將引用的字符串更改為L“foo”

將char更改為wchar_t

LPCWSTR - >指向恆定寬字符串的長指針。

您的所有錯誤消息都會減少為某種形式的char [XX]與wchar_t [XX]的類型不同。

Microsoft的Win32 API旨在使用ANSI字符串,char或寬字符串wchar_t進行編譯。 這就是為什么許多Win32函數有兩個簽名,一個以A結尾,另一個以W結尾。

例:

CreateWindowExW
CreateWindowExA

CreateWindowEx - 根據您的構建配置擴展為上述簽名之一的宏。 如果您定義UNICODE或_UNICODE,它將擴展為W版本。

通常,在Win32中編程時使用宏,並使用_T宏包裝所有字符串文字。 定義字符串的字符數組時,您將需要使用LPCTSTR和LPTSTR。 這些也是宏,它們將擴展為char *或wchar_t *,具體取決於您的構建設置。

我有它的工作。 使用wchar_t *和L“string”。 我的代碼的問題更多的是結構,因為復制/粘貼到新項目解決了我的錯誤。 多謝你們!

通過在Project > Property > Configuration Properties > General Character Set上選擇“未設置”,我能夠刪除錯誤C2440C2264

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM