我实际上使用的是非托管C ++ DLL,但我无法访问.h,.cpp或.lib,只能访问.DLL。
使用PE Explorer
并找到我想要使用的功能后,我得到的是:
@Tdtm_Dossier@Logon$qv; Index 1310; Unmangled Borland C++ Function: qualified function Tdtm_Dossier::Logon()
以下是我使用dumpbin
得到的结果:
1310 11F9 00105234 @Tdtm_Dossier@Logon$qv
以下是例外:
Unhandled Exception at 0x034B258C (modDll.dll) in functionsCpp.exe : 0xC0000005 :
Access violation writting to 0x000000AC.
我用来调用和使用此函数的代码如下:
#include <stdio.h>
#include <Windows.h>
#include <iostream>
typedef int (*Logon)();
int main()
{
HMODULE modDll;
int resultLogon;
modDll= LoadLibrary("C:\\dll\\modDll.dll");
Logon logon;
logon = (Logon)GetProcAddress(modDll,"@Tdtm_Dossier@Logon$qv");
if(logon)
{
resultLogon = logon(); //<-- This is where I get the exception
printf("Function has been loaded\n");
}
else
// TODO: Error message
FreeLibrary(modDll);
}
由于DLL文档并未提供有关如何使用该函数的任何有趣信息,因此我无法依赖它。
DLL已正确加载,GetProcAddress
确实返回了一些内容。我猜(但我不确定)它与我的typedef
有关,但我无法弄清楚这个函数的返回类型是什么。
答案 0 :(得分:1)
如果您阅读例如this document on Borland C++ name mangling您可能会发现符号名"@Tdtm_Dossier@Logon$qv"
代表类Tdtm_Dossier
的非静态成员函数。你不能像普通函数那样调用非静态成员函数,它们有一个隐藏的第一个参数,它成为成员函数中的this
指针。
这里发生的事情是可能 Logon
成员函数试图访问对象实例的成员变量,其中没有,这会导致未定义的行为和崩溃。< / p>
为了能够使用此库,您需要头文件和链接库。你不能只调用函数(成员与否)并希望最好。