【发布时间】:2016-01-06 14:00:58
【问题描述】:
我已搜索并找不到任何可以回答我的问题的内容。如果我的问题的措辞不正确,请提出建议,我会重新措辞。我不自称是指针专家,但我正在做的事情似乎相当简单,并且在此处提供的指导范围内:
Pointers and Pointer Types (Delphi)
我有一个用 Delphi 编写的 DLL。它是从 C++ 应用程序 (sfms_trayicon.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 指针类型的分配有效。取消引用偶尔会起作用,但大多数时候会产生访问冲突:
我的问题,我希望它足够具体,为什么取消引用指针的行偶尔会起作用,但大多数时候会引发访问冲突? 我想后续行动会是,我需要做什么才能使其工作?
谢谢
【问题讨论】:
-
请不要描述调用代码,并向我们保证它是正确的。你可能是错的。请出示。请出示完整的minimal reproducible example。请互操作的双方。 DLL 代码可以减少到 20 行,调用代码类似。不匹配的明显原因是调用约定错误(这看起来像
register)或者您没有传递您认为正在传递的内容。例如,传递包含HWND的变量的地址肯定是错误的。按值传递HWND。此外,尽管您承诺这样做,但您的函数不会返回任何内容。 -
.... 你的尝试/最终是毫无意义的。看起来你正在随机尝试一些东西。是时候退后一步了。
-
@David Heffernan 这是一个开发练习,try/finally 稍后会充实或删除,只是作为一个地方标记。虽然达到了这一点,但不要随意尝试东西:)我认为您可能是正确的,因为指针参数不是它应该是的(尽管该函数有时会在没有 AV 的情况下执行)。我看过 Remy 的建议,我认为它是合理的,并且会让 C++ 例程的作者在第一个实例中简单地传递一个 Windows 句柄作为参数。感谢您的回复。
-
嗯,我的评论中也有这个建议。
-
@David Heffernan,是的,我也应该说,当我说“我认为你可能是正确的”时。我也应该说我看过雷米和你的建议,我认为这些建议是合理的......这并不是轻微的。
标签: function delphi pointers dll