gpt4 book ai didi

c++ - 指向 DLL 中回调的指针

转载 作者:太空狗 更新时间:2023-10-29 21:51:09 25 4
gpt4 key购买 nike

我正在调用一个在 DLL 中具有资源和 dlg 过程的对话框。我没有使用 DEF 文件或 LIB 文件。函数名称已知,函数参数已知,我正在使用 GetProcAddress 获取指向我感兴趣的函数的指针。

'为什么'我这样做并不重要,这是一个'学习'的实验。

这适用于 _cdecl 函数,但在 CALLBACK (_stdcall) 上,我无法获得指向实际对话过程的指针(它返回 0)。

以下是我的建议:

//////////////////// DLL TEST STUFF ////////////////////////////

#define DLLPATH "../../testdll/release/testdll.dll"

//typedef some function pointers
typedef HINSTANCE (__cdecl *INSTPROC )(void);
typedef int (__cdecl *VOIDPROC )(void);
typedef LRESULT (__stdcall *DLGROC )(HWND, UINT, WPARAM, LPARAM );

///////////////////////////////////////////////////////////////

正如我所说,任何不是回调的函数都会返回有效结果,此外,对话框会按预期弹出,DLL 的 HINSTANCE 没有问题。

但是如果没有指向它的 dlgproc 的指针,则按钮消息无处可去。

下面是一些测试代码:

 //use DLL funcs without lib or def files

//this works
GetInst = (INSTPROC)GetProcAddress(Loadme,"getinst");
//this works
GetID = (VOIDPROC)GetProcAddress(Loadme,"getid");
//this doesn't work, rets 0
DlgProc = (DLGPROC) GetProcAddress(Loadme,"dllProc");

//test for result
dllid =(GetID)();
dllinst=(GetInst)();

//compare hinst OK
wsprintf(buf,"dllinst=%x Loadme=%x",dllinst, Loadme);
MessageBox(hwnd,buf,"",MB_OK);

//check resOurce ID OK
wsprintf(buf,"GetID returned: %d",dllid);
MessageBox(hwnd,buf,"",MB_OK);

//check dllProc addr NOGO, ret=0
wsprintf(buf,"dllProc=%x",DlgProc);
MessageBox(hwnd,buf,"",MB_OK);

// DLL instance, resource ID, parent, dlgproc
DialogBox(Loadme , MAKEINTRESOURCE(dllid), hwnd, DlgProc);

//dialog loads and shows, can't get dlgproc addr

FreeLibrary(Loadme);
///////////////// END DLL TEST STUFF ///////////////

在 DLL 方面,它看起来像这样:

__declspec(dllexport) LRESULT CALLBACK dllProc(
HWND hwnd,
UINT Message,
WPARAM wParam,
LPARAM lParam
)
{

hpwnd=hwnd;

switch (Message){

case WM_INITDIALOG:
MessageBox(hwnd,"At DlgProc...","",MB_OK);
return TRUE;

case WM_COMMAND:
switch(LOWORD(wParam)){
case IDEND:
case IDCANEND:
EndDialog(hwnd,0);
return TRUE;
}
return TRUE;
}
return FALSE;
}

此时这真的无关紧要,因为我一开始就无法获得指向回调的指针。

如果有人碰巧知道获取回调指针的修复方法,我将非常感谢您的意见。

感谢您的耐心等待。

最佳答案

您需要在 extern "C" block 中声明您的 dllProc 以防止其名称在导出时被修饰,这样当您请求名为“dllProc”的函数时,就会找到这样的函数(而不是“dllProc@blahmoocow”或 C++ 修饰产生的任何疯狂。:-))。

将此声明放在 dllProc 定义之前:

extern "C"
{
__declspec(dllexport) LRESULT CALLBACK dllProc(
HWND hwnd, UINT Message, WPARAM wParam, PARAM lParam);
}

您还可以从 dllProc 定义中删除 __declspec(dllexport)

关于c++ - 指向 DLL 中回调的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4352449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com