Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 从C+传递指针+;Delphi动态链接库_Function_Delphi_Pointers_Dll - Fatal编程技术网

Function 从C+传递指针+;Delphi动态链接库

Function 从C+传递指针+;Delphi动态链接库,function,delphi,pointers,dll,Function,Delphi,Pointers,Dll,我已经搜索过了,没有找到任何能回答我问题的东西。如果我的问题措辞不正确,请提出建议,我将重新措辞。我并不自称是指针方面的专家,但我所做的似乎相当直截了当,并且在这里提供的指导范围内: 我有一个用Delphi编写的DLL。它是从C++应用程序调用的(SFMsTrayIcx.exe)。所讨论的函数是指针类型,它有一个参数,一个指针。指针作为通用指针传递,然后转换为hWnd指针。然后将其取消引用到hWnd类型的变量。以下是实际的功能代码: function sfms_ui_init(FhWn

我已经搜索过了,没有找到任何能回答我问题的东西。如果我的问题措辞不正确,请提出建议,我将重新措辞。我并不自称是指针方面的专家,但我所做的似乎相当直截了当,并且在这里提供的指导范围内:

我有一个用Delphi编写的DLL。它是从C++应用程序调用的(SFMsTrayIcx.exe)。所讨论的函数是指针类型,它有一个参数,一个指针。指针作为通用指针传递,然后转换为hWnd指针。然后将其取消引用到hWnd类型的变量。以下是实际的功能代码:

    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);//编译器错误!

请不要描述呼叫代码,并向我们保证它是正确的。你可能错了。请出示。请出示完整的表格。互操作的双方