显式DLL的调用问题,应该不难,但是我实在搞不懂啦……抓狂了
高手们好,要是闲着,帮俺看看吧,要是忙着,还请闲着的时候也帮俺看看吧:
俺写一个DLL,DLL中的函数都是extern "C" __declspec(dllexport)的,显式链接到我的C++工程中,LoadLibrary正常,但调用时报错Runtime Check Failure #0 - The value of ESP was not properly saved across a function call. THis usually a result of calling a function declared with one calling convetion with a function pointer declared with a different calling convention.
说是调用规则不同。可是俺在调用时只是按联机文档中的方法:
typedef PREVENTRESULT (CALLBACK* LPPRDLLFUNC)(PRPUBLICINFOPTR);
LPPRDLLFUNC lpPrDllFunc = NULL;
if (NULL == m_hPrDll)
return PER_DLL_NOT_INIT;
if (NULL == (lpPrDllFunc = (LPPRDLLFUNC)GetProcAddress(m_hPrDll, "OnInitialPr")))
return PER_EVENT_NO_RESPONSE;
PREVENTRESULT result = lpPrDllFunc(pPublicInfo); // 这里报上述错误
return result;
extern "C"是我加上去的,但如果我去掉的话,GetProcAddress函数就会找不到我这个导出函数,我郁闷啊,这是咋回事?毕业设计就要交了,这活儿干的。。。
高手们,指给俺点儿迷津吧……
问题点数:40、回复次数:5Top
1 楼krh2001(边城浪子)回复于 2005-06-02 22:29:59 得分 30
函数原形跟你声明的不一致,导致堆栈异常了.
typedef PREVENTRESULT (CALLBACK* LPPRDLLFUNC)(PRPUBLICINFOPTR);
你这个声明 跟 DLL 内的不一致.去掉 CALLBACK
Top
2 楼rick29(rick.z)回复于 2005-06-02 22:41:00 得分 0
我刚也这么试了,也发现了这个问题,过来一看果然如此,高手不愧高手!
但是我的目的是,是否可以不用extern "C"?因为我加上这个以后GetProcAddress就会找不到我的导出函数。而加上extern "C"后,我就无法在DLL中实现函数重载了。
是否有解决的办法?一定给分,非常感谢!Top
3 楼slience(疏星朗月)回复于 2005-06-03 08:27:43 得分 5
应该不会呀!我用过N次了,用extern可以调用要导出的函数的!
也可以不用extern "C"而在工程中加*.def文件,在文件中写入:
LIBRARY MyDll
EXPORTS
Max //导出函数名
Min //导出函数名Top
4 楼rick29(rick.z)回复于 2005-06-03 19:16:52 得分 0
我的意思是能否不用extern "C",因为这样生成的C格式的导出符号里不允许有重载的情况。。Top
5 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-06-03 19:38:51 得分 5
需要注意函数调用约定,保证一致Top




