C++ 调用C++;当我试图访问DLL中的调用参数指针时,它会崩溃

C++ 调用C++;当我试图访问DLL中的调用参数指针时,它会崩溃,c++,c,dll,parameters,crash,C++,C,Dll,Parameters,Crash,我编写了一个C程序,它使用指向函数的指针数组。这个 函数既在我的程序中,也在可加载的DLL中。我的问题来了 当我尝试使用来自C++程序的DLL时。这是一个简单的例子 C++(DLL)程序中代码的断点:< /P> 问题是,只要我试图用pt做任何事情,它就会崩溃。不是 NULL,但如果我尝试写入它,甚至只是访问它的成员,它 撞车。我已经解决了这个问题,通过将C++代码转换成C,但是 我真的很想知道为什么会崩溃。如果我试图 访问pt,程序运行良好(除了缺少 将随附正确的pt)。顺便说一句,还有一件奇怪

我编写了一个C程序,它使用指向函数的指针数组。这个 函数既在我的程序中,也在可加载的DLL中。我的问题来了 当我尝试使用来自C++程序的DLL时。这是一个简单的例子 C++(DLL)程序中代码的断点:< /P> 问题是,只要我试图用pt做任何事情,它就会崩溃。不是 NULL,但如果我尝试写入它,甚至只是访问它的成员,它 撞车。我已经解决了这个问题,通过将C++代码转换成C,但是 我真的很想知道为什么会崩溃。如果我试图 访问pt,程序运行良好(除了缺少 将随附正确的pt)。顺便说一句,还有一件奇怪的事- 在now 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);
我已经尝试在 GetProcAddressTypeCast

我甚至在我的linux版本中尝试过这样做。它也崩溃了,所以它不是 仅限Windows的问题


有什么想法吗?

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

  • 函数调用约定
  • 结构填料
  • 结构内容

如果所有这些看起来都很好,则在调用函数的点处中断,并显示作为参数传递的所有内容。然后进入函数并检查所有内容是否相同

在我看来,问题似乎源于以下声明:

VECT (*normal)();
这里您告诉编译器,
normal
是指向返回
VECT
的函数的指针。但您尚未指定函数的参数,因此编译器将允许您传递任何您喜欢的内容,并尝试确定要传递的类型。这是非常糟糕的做法。你应该停止这样做。将“正常”声明更改为以下内容:

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

< >我在C++代码中看不到任何指定调用约定的地方,所以假设默认的<代码> CCDL> <代码>生效。显然,你需要在你的界面上匹配它,如果你为你的函数指针指定了无调用约定,那么你也会得到默认的
cdecl

当它崩溃时,
pt
的值在调用方的堆栈框架中与DLL/共享库中的值相同吗?什么是
normal
。请出示申报单。实际上,向我们展示您传递的参数的声明。另外,“代码”> GETPROCELATION/CODE >的外观看起来很假。有没有办法让C++接受第二种指定参数的方式?没有,你问这个问题是一个令人担忧的迹象。这类问题很容易解决。但是,不要像一只无头小鸡一样到处乱跑,随意尝试,选择第一件不会崩溃的东西。理解问题。然后解决它。(指针的)值不相同。我现在在linux上,所以我必须尝试linux版本。@DavidHeffernan我不确定你指的是哪个“正常”,但这里有一个:typedef struct Funcs{int(*inter)();VECT(*normal)(;}Funcs;
VECT (*normal)(OBJECT *obj, RAY ray, float t, VECT *pt, RGB *col);