2014-10-20 219 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

相关问题