2014-10-20 231 views
0

我不得不更新一些字符串,因爲多年來一些事情發生了變化,但現在它不會編譯。這最初是在VS2010中完成的。它在C.的Win32 API進行編碼現在我使用2012丟給這些錯誤:「HANDLE」與參數類型「HINSTANCE」不兼容

1 IntelliSense: argument of type "HANDLE" is incompatible with parameter of type "HINSTANCE" 
2 IntelliSense: argument of type "LRESULT (__stdcall *)(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)" is incompatible with parameter of type "DLGPROC" 

,這是編輯的程序:

// NSIS stack structure 
typedef struct _stack_t 
{ 
    struct _stack_t *next; 
    char text[256]; 
} stack_t; 

stack_t **g_stacktop; 


// Function prototypes 
char *getvar(int varnum); 
void setvar(int varnum, char *var); 
int runDialogBox(); 
HBITMAP LoadPicture(UINT nID); 
BOOL DrawPicture(HDC hDC, LPRECT lpRect); 

// Global variables 
char szBuf[256]=""; 
char szError[4]=""; 
int nVarError; 
int res = 0; 
HINSTANCE g_hInstance; 
HWND g_hwndParent; 
int g_stringsize; 
char *g_variables; 


BOOL APIENTRY DllMain(HANDLE hModulePar, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 

    static HBRUSH hBrushStatic; 


void __declspec(dllexport) Show(HWND hwndParent, int string_size, char *variables, stack_t  **stacktop) 
{ 
    g_hwndParent=hwndParent; 
    g_stringsize=string_size; 
    g_variables=variables; 
    res = runDialogBox(); 
    if (res == 0) 
     setvar(INST_1,"NO"); 
    else 
    setvar(INST_1,"YES"); 
} 

int runDialogBox() 
{ 
    int result = FALSE; 
    result = DialogBoxParam(hModule, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc, (LPARAM) (NULL));  

    return result; 
} 
+0

它是一個NSIS插件,編碼爲Win32 C dll。我想我可以把它全部拿出來切換到MFC?簡而言之,它只是顯示一個複雜的對話框(比本機消息框能夠處理更復雜),然後在那裏處理它。 – 2014-10-20 13:49:07

+1

如果您告訴我們哪條線路有錯誤,它可以節省大家很多時間。此外,如果您刪除了與問題無關的所有代碼行。 – 2014-10-20 14:14:45

+0

@RaymondChen:最初代碼太少。 – 2014-10-20 14:34:14

回答

3

的代碼與STRICT註銷,顯然。這就像禁用所有編譯器警告一樣;編寫良好的代碼將起作用,但這些工具無法幫助您發現錯誤。所以我建議您在項目中打開STRICT

要消除您顯示的代碼中的問題,請將變量hModule的類型從HANDLE更改爲HINSTANCE。顯然hModule的型號爲HANDLE,因爲它來自DllMain的參數是使用HANDLE,但這也是錯誤的。使用the correct signature shown on MSDN

BOOL WINAPI DllMain(
         _In_ HINSTANCE hinstDLL, 
         _In_ DWORD fdwReason, 
         _In_ LPVOID lpvReserved 
        ); 

這聽起來像有與DialogProc簽名也是一個問題,但你還沒有告訴我們它的定義。也許你需要將其返回類型更改爲INT_PTR,以匹配the documentation另外,請自己幫忙併使用不同的函數名稱。正如醫生說:

DialogProc is a placeholder for the application-defined function name.

你不應該需要對LPARAM參數鑄造無論是。

+0

我從來不知道嚴格關閉。我剛剛在桌面上安裝了vstudio,因爲我的舊電腦是2010年的電腦。 – 2014-10-20 13:54:35

+0

@Jon:您對DialogProc和DllMain的簽名與文檔不符。 DialogProc應該返回'INT_PTR'。 DllMain的第一個參數是'HINSTANCE'類型。修復這些問題(並調整'hModule'變量的類型)可以解決問題。 – 2014-10-20 14:35:18

+0

我更改爲:'INT_PTR CALLBACK dlgBox(HWND hDlg,UINT消息,WPARAM wParam,LPARAM lParam)'但出現錯誤:'LPSTR「類型的參數與類型爲」UINT「'的參數不兼容。 hModule參數也是一個問題。對不起,今天這麼愚蠢,自從我做這個項目以來,這是一段很長的時間。 – 2014-10-20 15:12:54

相關問題