“HANDLE”与参数类型“HINSTANCE”不兼容
我不得不更新一些字符串,因为多年来一些事情发生了变化,但现在它不会编译。这最初是在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;
}
的代码与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
参数铸造无论是。
我从来不知道严格关闭。我刚刚在桌面上安装了vstudio,因为我的旧电脑是2010年的电脑。 – 2014-10-20 13:54:35
@Jon:您对DialogProc和DllMain的签名与文档不符。 DialogProc应该返回'INT_PTR'。 DllMain的第一个参数是'HINSTANCE'类型。修复这些问题(并调整'hModule'变量的类型)可以解决问题。 – 2014-10-20 14:35:18
我更改为:'INT_PTR CALLBACK dlgBox(HWND hDlg,UINT消息,WPARAM wParam,LPARAM lParam)'但出现错误:'LPSTR“类型的参数与类型为”UINT“'的参数不兼容。 hModule参数也是一个问题。对不起,今天这么愚蠢,自从我做这个项目以来,这是一段很长的时间。 – 2014-10-20 15:12:54
它是一个NSIS插件,编码为Win32 C dll。我想我可以把它全部拿出来切换到MFC?简而言之,它只是显示一个复杂的对话框(比本机消息框能够处理更复杂),然后在那里处理它。 – 2014-10-20 13:49:07
如果您告诉我们哪条线路有错误,它可以节省大家很多时间。此外,如果您删除了与问题无关的所有代码行。 – 2014-10-20 14:14:45
@RaymondChen:最初代码太少。 – 2014-10-20 14:34:14