我导出用:
extern "C" void __declspec(dllexport) __stdcall function ();
导入用:
void (__stdcall* func) (void);
func = (void (__stdcall*) (void)) GetProcAddress (hDll, "function");
使用 gcc 的 objdump 工具可以看到 dll 导出列表中有 function, 但导入时
func 为空, 请教正确的做法该如何导入导出.
extern "C" void __declspec(dllexport) __stdcall function ();
导入用:
void (__stdcall* func) (void);
func = (void (__stdcall*) (void)) GetProcAddress (hDll, "function");
使用 gcc 的 objdump 工具可以看到 dll 导出列表中有 function, 但导入时
func 为空, 请教正确的做法该如何导入导出.
BOOL __declspec(dllexport) __stdcall CreateTalkDlg(HWND hParentWnd)
{
}
在 dll工程 def文件中 添加 free调用者
typedef BOOL __declspec(dllimport) (__stdcall CreateTalkDlg_Pro)(HWND hParentWnd);
extern CreateTalkDlg_Pro CreateTalkDlg;
导出
extern "C" void __declspec(dllexport) __stdcall function ();
改为
extern "C" void __declspec(dllexport) function ();
已测试,行的。为什么我也还没搞懂。
Get.....Adress
1.将函数据定义成__cdecl(C/C++缺省)
2.在项目中加一def文件,内容为
LIBRARY "你的DLL工程名称"
DESCRIPTION '随便,如testdll Windows Dynamic Link Library'
EXPORTS
StartLDGis @1
并且,你要检查Project|Settings设置,确保有“/def:".\testdll.def"”这么一句。如果在.def里登记了函数名,你就不得不将__declspec(dllexport)去掉。def文件在项目中新增参见msdn帮助:ms-help://MS.MSDNQTR.2003FEB.2052/vccore/html/_core_.2f.DEF.htm所以楼主只要这样就行:
extern "C" void __declspec(dllexport) __stdcall function ();
改为
extern "C" void __declspec(dllexport) _cdecl function ();
__stdcall 细节
__stdcall 函数的参数被从右到左推送到堆栈上,被调用函数在返回之前从堆栈中弹出这些参数。对于 C,__stdcall 命名约定使用以下划线 ( _ ) 开头的函数名,后跟“at”符 (@) 和函数参数大小(以字节为单位)。不执行任何大小写转换。编译器使用下列命名约定模板:_functionname@number
你使用Dll的地方是使用你的头文件和lib呀。直接#include 你的dll的头文件就可以了呀。用def文件就用不着什么 __declspec(dllexport) __declspec(dllimport) 这些关键词了。直接去掉就行了。