我不得不更新一些字符串,因为这些年来发生了一些变化,但现在它不会编译。这最初是在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;
}
答案 0 :(得分: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
是应用程序定义的函数名称的占位符。
您也不需要在LPARAM
参数上进行投射。