c - "HANDLE"与类型为 "HINSTANCE"的参数不兼容

标签 c winapi

我不得不更新一些字符串,因为多年来发生了一些变化,但现在它无法编译。这最初是在 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/

相关文章:

c - 二维数组问题

python - 将调用 C 函数的 Python 2.7 代码移植到 Python 3.4

c# - 如何在 C# 中访问指向结构数据的编码指针?

结合两个 16 位 RGB 颜色与 alpha 混合

Delphi 10 Seattle 更改为 Win32 GetPath 以及冗余 TPoint 和 _POINTL 记录类型

windows - COM `IStream` 接口(interface)指针和来自不同线程的访问

c - 如何从 Ruby C VM 中加载的脚本中获取基准测试?

winapi - 如何用 Haskell 编写 Windows 服务应用程序?

winapi - 将寄存器/整数打印到控制台 | FASM | WinAPI

c++ - WaitForSingleObject 不起作用