Function 从C+传递指针+;Delphi动态链接库
我已经搜索过了,没有找到任何能回答我问题的东西。如果我的问题措辞不正确,请提出建议,我将重新措辞。我并不自称是指针方面的专家,但我所做的似乎相当直截了当,并且在这里提供的指导范围内: 我有一个用Delphi编写的DLL。它是从C++应用程序调用的(SFMsTrayIcx.exe)。所讨论的函数是指针类型,它有一个参数,一个指针。指针作为通用指针传递,然后转换为hWnd指针。然后将其取消引用到hWnd类型的变量。以下是实际的功能代码:Function 从C+传递指针+;Delphi动态链接库,function,delphi,pointers,dll,Function,Delphi,Pointers,Dll,我已经搜索过了,没有找到任何能回答我问题的东西。如果我的问题措辞不正确,请提出建议,我将重新措辞。我并不自称是指针方面的专家,但我所做的似乎相当直截了当,并且在这里提供的指导范围内: 我有一个用Delphi编写的DLL。它是从C++应用程序调用的(SFMsTrayIcx.exe)。所讨论的函数是指针类型,它有一个参数,一个指针。指针作为通用指针传递,然后转换为hWnd指针。然后将其取消引用到hWnd类型的变量。以下是实际的功能代码: function sfms_ui_init(FhWn
function sfms_ui_init(FhWnd: Pointer): Pointer;
var
pCallinghWnd: ^hWnd; // hWnd pointer type
begin
try
// Get the hWnd passed as a generic pointer
pCallinghWnd := FhWnd; // Cast the general pointer to a hWnd pointer
CallinghWnd := pCallinghWnd^; // De-reference the pointer (CallinghWnd is a global var of type hWnd)
finally
end;
end;
传递给函数的指针有效。对hWnd指针类型的赋值有效。取消引用偶尔会起作用,但大多数情况下会生成和访问冲突:
我的问题是,我希望它足够具体,为什么取消引用指针的行偶尔会起作用,但大多数时候会抛出访问冲突?
我想接下来的问题是,我需要做什么才能让它发挥作用
谢谢
< P> delphi和C++是强类型语言。因为您的函数需要一个指向HWND
的指针作为输入,所以将其声明为这样,例如:
类型
PHWND=^HWND;
函数sfms_ui_init(FhWnd:PHWND):指针;
开始
调用hwnd:=FhWnd^;
//...
结束;
或者更好:
函数sfms\u ui\u init(var FhWnd:HWND):指针;
开始
调用hwnd:=FhWnd;
//...
结束;
通过指针/引用传递HWND
变量没有意义,除非函数需要直接修改调用方的HWND
变量。HWND
已经是指针,因此在大多数情况下应该按值传递:
函数sfms\u ui\u init(FhWnd:HWND):指针;
开始
调用hwnd:=FhWnd;
//...
结束;
为什么反引用指针的行偶尔会起作用,但大多数时候会抛出访问冲突?我想接下来的问题是,我需要做什么才能让它发挥作用
没有看到你的C++代码,真的没有办法回答这个问题。但是,由于您的函数期望一个指向<代码> HWND < /C>的指针,但它接受它是一个通用的非类型化的<代码>指针<代码>,很有可能C++代码没有将正确的内存地址传递给该指针。例如,如果C++代码是这样做的:
HWND-HWND=。。。;
sfms_ui_init(hWnd);//传错地址了!
当它应该这样做时:
HWND-HWND=。。。;
sfms_ui_init(&hWnd);//传递正确的地址!
Delphi中的代码>代码>指针<代码>转换为C++中的代码>虚空*>代码,没有类型信息。HWND
已经是指针,任何指针都可以传递给void*
,因此编译器允许赋值,但会导致运行时错误
因此,我们更有理由放弃非类型化指针,转而使用类型化指针。使用适当的类型,C++编译器验证正确的指针值是否传递给函数,例如:
//给定:函数sfms\u ui\u init(FhWnd:PHWND):指针;
//或:函数sfms_ui_init(var FhWnd:HWND):指针;
HWND HWND=。。。;
sfms_ui_init(hWnd);//编译器错误!
sfms_ui_init(&hWnd);//好啊
//给定:函数sfms\u ui\u init(FhWnd:HWND):指针;
HWND HWND=。。。;
sfms_ui_init(hWnd);//好啊
sfms_ui_init(&hWnd);//编译器错误!
< /代码> Delphi和C++是强类型语言。因为您的函数需要一个指向
HWND
的指针作为输入,所以将其声明为这样,例如:
类型
PHWND=^HWND;
函数sfms_ui_init(FhWnd:PHWND):指针;
开始
调用hwnd:=FhWnd^;
//...
结束;
或者更好:
函数sfms\u ui\u init(var FhWnd:HWND):指针;
开始
调用hwnd:=FhWnd;
//...
结束;
通过指针/引用传递HWND
变量没有意义,除非函数需要直接修改调用方的HWND
变量。HWND
已经是指针,因此在大多数情况下应该按值传递:
函数sfms\u ui\u init(FhWnd:HWND):指针;
开始
调用hwnd:=FhWnd;
//...
结束;
为什么反引用指针的行偶尔会起作用,但大多数时候会抛出访问冲突?我想接下来的问题是,我需要做什么才能让它发挥作用
没有看到你的C++代码,真的没有办法回答这个问题。但是,由于您的函数期望一个指向<代码> HWND < /C>的指针,但它接受它是一个通用的非类型化的<代码>指针<代码>,很有可能C++代码没有将正确的内存地址传递给该指针。例如,如果C++代码是这样做的:
HWND-HWND=。。。;
sfms_ui_init(hWnd);//传错地址了!
当它应该这样做时:
HWND-HWND=。。。;
sfms_ui_init(&hWnd);//传递正确的地址!
Delphi中的代码>代码>指针<代码>转换为C++中的代码>虚空*>代码,没有类型信息。HWND
已经是指针,任何指针都可以传递给void*
,因此编译器允许赋值,但会导致运行时错误
因此,我们更有理由放弃非类型化指针,转而使用类型化指针。使用适当的类型,C++编译器验证正确的指针值是否传递给函数,例如:
//给定:函数sfms\u ui\u init(FhWnd:PHWND):指针;
//或:函数sfms_ui_init(var FhWnd:HWND):指针;
HWND HWND=。。。;
sfms_ui_init(hWnd);//编译器错误!
sfms_ui_init(&hWnd);//好啊
//给定:函数sfms\u ui\u init(FhWnd:HWND):指针;
HWND HWND=。。。;
sfms_ui_init(hWnd);//好啊
sfms_ui_init(&hWnd);//编译器错误!
请不要描述呼叫代码,并向我们保证它是正确的。你可能错了。请出示。请出示完整的表格。互操作的双方