我不得不更新一些字符串,因为多年来发生了一些变化,但现在它无法编译。这最初是在 VS2010 中完成的。它是在 C 的 Win32 API 中编码的。现在我使用的是 2012,它抛出了这些错误:
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
参数进行强制转换。
关于c - "HANDLE"与类型为 "HINSTANCE"的参数不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26466959/