C 回调函数在对象 pascal 上崩溃
C callback function crash on object pascal
我正在创建一个如下所示的C dll。
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* fun accept an argument status_callback which is a function pointer*/
TEST_API void fun(void(*status_callback)(int));
#ifdef __cplusplus
}
#endif
乐趣实现为:
void fun(void(*status_callback)(int)) {
status_callback(0);
}
当在带有 delphi xe 的对象 pascal 上使用此 dll 时,如下所示,我在回调函数的地址出现访问冲突时
崩溃type
TStatusCallBack = procedure( Value: Integer ); stdcall;
T_fun = procedure(cb : TStatusCallback );
procedure BCallBack( Value: Integer ); stdcall;
begin
BStatus := value;
end;
begin
_fun(BCallBack);
end;
实例化代码:
DLLHandle := LoadLibrary( ‘mylib.dll’ );
if (DLLHandle > HDLL_ERROR) then
begin
_fun := T_fun(GetProcAddress( DLLHandle, 'fun');
end;
问题出在哪里?因为我是C的菜鸟,所以有什么评论吗??
我们缺少重要的细节。我们看不到C++方面实施fun
,也看不到您如何在德尔福方面宣布_fun
。
但是,我们可以看到一个错误。回调的调用约定不匹配。C++代码将回调定义为__cdecl
。您需要使用cdecl
在德尔福方面进行匹配,而不是stdcall
.
同样,我希望您的 Delphi 代码会为_fun
弄错调用约定。同样应该cdecl
,但错误消息表明您的声明实际上是register
。
总之,对德尔福代码进行以下更改:
- 将回调函数类型声明为
cdecl
。 - 将实现回调的函数声明为
cdecl
。 - 将
fun
的导入声明为cdecl
。
查看您的编辑,您对LoadLibrary
返回值的错误检查是错误的。错误由返回值为零表示。将相等与零进行比较以测试失败。
调用GetProcAddress
时也无法检查错误。您需要处理返回nil
的情况。同样,这可能会导致编写的代码出现运行时错误。
您编辑中的代码显示我所有的猜测都是正确的。解决方案如上面的要点中所述。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- C 回调函数在对象 pascal 上崩溃