读书人

调用带指针参数的dll导出函数异常

发布时间: 2013-06-25 23:45:41 作者: rapoo

调用带指针参数的dll导出函数错误
void _declspec(dllexport) __stdcall GenStarPic(const char *PicDescribeXml,const char *date,const char *DepartmentId,const char *OutputFile)
{
return;
}
动态调用这个导出函数 实参怎么处理?


以下 调用报错
typedef void (* StarViwe_)(const char *,const char *,const char *,const char *);
HINSTANCE hmodule_StarViwe = ::LoadLibrary ("StarPic.dll");
if( NULL != hmodule_StarViwe )
{
StarViwe_ StarViwe = (StarViwe_)::GetProcAddress (hmodule_StarViwe, "GenStarPic");
if(NULL != StarViwe)
{
char * StarPicDescribeXml,*StartDate,*StarDepartmentId,*StarOutputFile;
CString StarPicDescribeXmlN ="" ,StartDateN ="" ,StarDepartmentIdN ="",StarOutputFileN ="";
StarPicDescribeXmlN =Path ;
StartDateN = BText11;
StarDepartmentIdN =DID;
StarOutputFileN =Path2;

StarPicDescribeXml =StarPicDescribeXmlN.GetBuffer(Path.GetLength()+1);
StartDate = StartDateN.GetBuffer(BText11.GetLength()+1);
StarDepartmentId =StarDepartmentIdN.GetBuffer(DID.GetLength()+1);
StarOutputFile = StarOutputFileN.GetBuffer(Path2.GetLength()+1);

StarViwe(StarPicDescribeXml, StartDate, StarDepartmentId, StarOutputFile);//调用

StarPicDescribeXmlN.ReleaseBuffer();
StartDateN.ReleaseBuffer();
StarDepartmentIdN.ReleaseBuffer();
StarOutputFileN.ReleaseBuffer();

::FreeLibrary (hmodule_StarViwe);

}
else
{
AfxMessageBox("GenStarPic函数地址错误!");
::FreeLibrary (hmodule_StarViwe);
}
}
else
{
AfxMessageBox("StarPic.dll加载失败");
}

[解决办法]
LoadLibrary试试
[解决办法]
Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC 动态库)、MFC Regular DLL(MFC 规则DLL)、MFC Extension DLL(MFC 扩展DLL)。你用的是MFC的框架,所以我不能确定你做DLL的时候是否已经区别开了这三种方式。
Win32 Dynamic-Link Library导出函数通常写法是extern "C" void __declspec(dllexport)fun(xx xx, x xx,...);你确定一下这里是否有问题。
[解决办法]
有时要从根本上解决函数调用违反约定出错问题,必须单步调试函数调用前后对应的汇编指令。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

读书人网 >C++

热点推荐