繁体   English   中英

从C程序调用C ++ DLL时,当我尝试访问DLL中的调用参数指针时会崩溃

[英]When calling a C++ DLL from a C program it crashes when I try to access call parameter pointer in the DLL

我编写了一个C函数,该函数使用指向函数的指针数组。 这些功能都在我的程序内部和可加载的DLL中。 当我尝试使用来自C ++程序的DLL时,出现了我的问题。 这是C ++(DLL)程序中代码的简化片段:

#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif

typedef struct { float x,y,z; } VECT;

EXPORT VECT norm(OBJECT *obj, RAY ray, float t, VECT *pt, RGB *col)
{
VECT npt;
...
*pt = npt;  /* give pt a new value */
...
}

问题是,一旦我尝试对pt做任何操作,它就会崩溃。 它不是NULL,但是如果我尝试对其进行写入甚至只是访问它的成员,它都会崩溃。 我已经通过将C ++代码转换为C来解决了这个问题,但是我真的很想知道为什么会崩溃。 如果我尝试访问pt,则程序运行正常(除了缺少正确pt附带的功能外)。 顺便说一句,这是另一个奇怪的事情-当我在现在的C DLL代码中执行以下操作时:

EXPORT VECT norm(OBJECT *obj, RAY ray, float t, VECT *pt, RGB *col)

它崩溃了。 但是如果我这样做:

EXPORT VECT norm(obj, ray, t, pt, col)
OBJECT *obj;
VECT *pt;
RAY ray;
float t;
RGB *col;

它不会崩溃。 有什么办法让C ++接受指定参数的第二种方法?

额外信息,以备不时之需...我通过以下方式加载DLL函数:

typedef struct Funcs
{
int (*inter)();
VECT (*normal)();
} FUNCS;

/*
 I've also tried:
typedef VECT (WINAPI *FNORMAL)(OBJECT *obj, RAY ray, float t, VECT *pt, RGB *col);
(FNORMAL)GetProcAddress...
*/

funcs[i].normal = (VECT *)GetProcAddress(dll2, "norm");
if (funcs[i].normal == NULL) { printf("Error: No norm procedure in '%s'\n", objstr); quit(); }

并致电给他们:

hit.normal = funcs[p->type].normal(p, ray, mint, &pt, &colm);

并且我尝试在GetProcAddress类型转换中完全指定类型(而不只是VECT *)。

我什至尝试在我的Linux版本中执行此操作。 它也会崩溃,所以这不是Windows唯一的问题。

有任何想法吗?

对我来说,问题似乎源于以下声明:

VECT (*normal)();

在这里,您告诉编译器normal是指向返回VECT的函数的指针。 但是您尚未指定函数的参数,因此编译器将允许您传递您喜欢的任何东西,并且它将尝试确定要传递的类型。 那是非常糟糕的做法。 您应该停止这样做。 将normal的声明更改为如下:

VECT (*normal)(OBJECT *obj, RAY ray, float t, VECT *pt, RGB *col);

我看不到C ++代码中指定调用约定的任何地方,因此我们假设默认的cdecl有效。 显然,您需要在接口侧进行匹配,并且如果您没有为函数指针指定调用约定,那么您cdecl获得默认的cdecl

您必须确保在DLL构建和客户端构建期间所有涉及的编译参数都兼容。 需要特别注意:

  • 函数调用约定
  • 结构包装
  • 结构内容

如果所有这些看起来都不错,请在调用函数的那一刻中断,并显示您作为参数传递的所有内容。 然后进入该函数并检查一切看起来是否相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM