【发布时间】: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 创建一个允许我访问v1 和v2 属性的函数?
如
__declspec(dllexport) Tcreate create(const Vector* v1, const Vector* v2)
{
}
希望如果我的函数定义与确切的签名匹配,我可以得到v1和v2中的数据!
编辑: 我试图按如下方式创建函数: __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