【问题标题】:Cannot access object passed into my DLL无法访问传递给我的 DLL 的对象
【发布时间】:2014-08-27 07:45:13
【问题描述】:

我已得到签名

typedef Trajectory* (__stdcall* Tcreate)(const Vector* v1, const Vector* v2);

我需要能够实现一个调用名为“create”的函数的 DLL

我创建了函数:

__declspec(dllexport) Trajectory* create(const Vector* v1, const Vector* v2)
{
    ...
}

在此函数中,我尝试访问v1 的属性,例如v1->x,但出现错误:

无法计算表达式

当我尝试通过调试器检查变量时。

我怀疑这可能是一个问题,因为我没有将 create 与 Tcreate 中给出的 __stdcall* 匹配。

如何根据Tcreate typedef 创建一个允许我访问v1v2 属性的函数?

__declspec(dllexport) Tcreate create(const Vector* v1, const Vector* v2)
{
}

希望如果我的函数定义与确切的签名匹配,我可以得到v1v2中的数据!

编辑: 我试图按如下方式创建函数: __declspec(dllexport) 对象* __stdcall create(const Vector* v1, const Vector* v2) { ... }

它可以编译,但是当我这样做时,执行程序说它找不到函数“create”,我认为它正在使用 GetProcAddress,尽管我无法确定,因为 exe 没有调试信息。

【问题讨论】:

  • 这个功能是工作还是崩溃? “无法计算表达式”的原因可能是调试器对Vector 类型一无所知。将包含Vector 的项目添加到解决方案中。顺便说一句,最好将 create 函数声明为 __stdcall 以匹配 typedef 声明。
  • 感谢您的回复! DLL 实际上会崩溃,并且 Vector 的声明包含在 DLL 的标头中,因此它确实知道向量是什么。关于在函数定义中添加的 __sdtcall,当我这样做时,程序告诉我它无法找到请求的函数 - 尽管我相信这是问题的一部分。
  • unable to find the requested function 提供更多详细信息:如何加载 Dll 以及如何调用此函数。您还需要将 create 声明为 extern "C" - 使用 Dumpbin 验证函数导出时没有名称修改。
  • @AlexFarber create 实际上是在 extern "C" 下定义的,只是不包括在此处,实际上我无法提供有关可执行文件如何加载它的更多信息,因为我没有无法访问 exe 的源代码。不过,根据 Albi 在下面的回答,我觉得他们可能是基于显式链接加载它?他们给我的签名必须是创建他们将调用的函数的关键,这也将与他们预期的结构相同,因此我可以访问它传递指针的向量。
  • 您的带有 Object 和 Point* 的 __stdcall 定义与它们的 typedef 不匹配。

标签: c++ dll function-pointers msvcrt


【解决方案1】:

你应该在调用者中导入函数

 __declspec(dllimport) Trajectory* create(const Vector* v1, const Vector* v2);

这还取决于您的 dll 是如何加载的,无论是显式的还是隐式的。这是一个为 MS C++ 描述它的好网站

http://msdn.microsoft.com/en-us/library/9yd93633.aspx

【讨论】:

  • 感谢您的回复!我确实怀疑这是在可执行文件中完成的方式,但我无权访问它,所以我无法判断。从链接中的描述来看,我猜他们正在使用显式链接。如果是这种情况,我该如何将我的函数加载到可执行文件中? __stdcall 是否会对可执行文件的读取产生影响?谢谢!
  • 嗯,很难说在可执行文件中使用了哪种调用约定。你能试试 Trajectory* __stdcall create(const Vector* v1, const Vector* v2);
  • 使用 perfmon,您可以检查 dll 的加载和访问。
  • 感谢您在第一条评论中提出的建议。当我按照您的建议实现该功能时,我从 exe 中收到一条错误消息,提示“找不到所需的功能‘创建’”。我还用“depends”加载了 exe,这样我就可以看到 exe 和我的 DLL 需要哪些 DLL。 perfmon 有什么不同吗?现在将尝试弄清楚如何做到这一点。
猜你喜欢
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多