gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:05:04 25 4
gpt4 key购买 nike

我实际上使用的是非托管 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

这里是异常(exception):

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 有关,但我不知道这个函数的返回类型是什么。

最佳答案

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

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

要使用这个库,您需要头文件和链接库。您不能只调用函数(成员或非成员)并希望一切顺利。

关于调用 dll 函数时出现 C++ 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21882613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com