我使用以下代码访问dll文件中的方法,当从dll方法调用方法时,我得到Access violation reading location 0x41100000
。
我尝试访问的方法是以下原型
int dstoch(float,float,float,float,float,float,float,float,float);
这是我的代码
typedef int (*LPMyfunct)(float,float,float,float,float,float,float,float,float);
HINSTANCE hDLL = NULL;
LPMyfunct lpdstoch = NULL;
hDLL = LoadLibrary("c:\\myfile.dll");
if(hDLL!=NULL)
{
std::cout << "Library loaded \n";
lpdstoch = (LPMyfunct)GetProcAddress((HMODULE)hDLL, "dstoch");
int res = 0;
if(lpdstoch != NULL)
{
try
{
res = lpdstoch(1.1,2.2,3.3,4.4,5.4,6.4,7.4,8.8,9.9); //Gives the error
}
catch (std::exception &e)
{
std::cout << e.what();
}
}
}
有什么建议原因可能是什么? dll文件中是否有错误? 有什么办法可以读取dll文件的参数吗?请它检查我是否正确获取参数类型?依赖检查器显示该方法存在,但我不能确定参数类型?
更新
我仍然收到错误
test.exe中0x0040356c处的第一次机会异常:0xC0000005: 访问冲突写入位置0x42080000。处理未处理的异常 Cexperiment.exe中的0x0040356c:0xC0000005:访问冲突写入 位置0x42080000。
我也相信这个问题可能与调用约定无关。我相信的原因是因为我没有收到来自VS2010的错误消息,说明调用约定可能是一个原因。当我尝试时我收到了该消息使用其他一些DLL。因此,如果调用约定或参数不是问题(如果参数不同,则会获得相同的调用约定消息),那么它可能是其他内容。关于我可以尝试的任何建议?
答案 0 :(得分:2)
您需要检查dll函数的调用约定并相应地声明LPMyfunct
类型。调用约定的可能值包括:stdcall
,cdecl
,pascal
。