调用dll函数时C ++访问冲突

时间:2014-02-19 13:55:46

标签: c++ exception dll

我实际上使用的是非托管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有关,但我无法弄清楚这个函数的返回类型是什么。

1 个答案:

答案 0 :(得分:1)

如果您阅读例如this document on Borland C++ name mangling您可能会发现符号名"@Tdtm_Dossier@Logon$qv"代表类Tdtm_Dossier的非静态成员函数。你不能像普通函数那样调用非静态成员函数,它们有一个隐藏的第一个参数,它成为成员函数中的this指针。

这里发生的事情是可能 Logon成员函数试图访问对象实例的成员变量,其中没有,这会导致未定义的行为和崩溃。< / p>

为了能够使用此库,您需要头文件和链接库。你不能只调用函数(成员与否)并希望最好。