delphi - Delphi XE4 64位中的SendMessageTimeout产生访问冲突

标签 delphi

我想广播我的程序中一些环境变量的变化。因此其他一些实用程序可以使用新值。 当我在 Windows 7 平台上的 Delphy XE4 32 位中编译下一个例程时,一切似乎都工作正常。 当我将 Delphy 切换到 64 位平台时,调试器会产生访问冲突。

有什么建议吗?

<小时/>
procedure BroadcastChange;
    var
        lParam, wParam : Integer;
        Buf : Array[0..10] of Char;
        aResult : PDWORD_PTR;
    begin
        Buf := 'Environment';
        wParam := 0;
        lParam := Integer(@Buf[0]);
        SendMessageTimeout(HWND_BROADCAST,
                           WM_SETTINGCHANGE,
                           wParam,
                           lParam,
                           SMTO_NORMAL,
                           4000,
                           aResult );
    end;

最佳答案

您需要以 null 终止字符串。只需将声明切换为使用 PChar .

您还必须停止将指针强制转换为 32 位 Integer这会将 64 位指针截断为 32 位指针,这很容易导致痛苦。

由于您不使用 aResult,因此传递 nil。您未初始化的指针显然是一个问题。

procedure BroadcastChange;
begin
  SendMessageTimeout(
    HWND_BROADCAST, 
    WM_SETTINGCHANGE,
    0, 
    LPARAM(PChar('Environment')), 
    SMTO_NORMAL, 
    4000, 
    nil
  );
end;

关于delphi - Delphi XE4 64位中的SendMessageTimeout产生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958257/

相关文章:

regex - RegEx模式可在这些情况下限制破折号

delphi - cxgrid列过滤器选项“之间”

delphi - 在 Delphi 中导入和处理 CSV 文件中的数据

c# - 获取当前鼠标光标类型

delphi - 如何/如果仅使用表单和数据模块重构 Delphi 程序

delphi - 使用 Delphi-Mocks 和 Spring4D 模拟 DUnit 中的接口(interface)

sql - 如何将表中的值保存到另一个表中

c++ - 在 Delphi 应用程序中使用 C++ DLL 回调函数

delphi - 我可以让 TComboBoxEx 与 TComboBox 具有相同的高度吗?

HTML 5 真的可以做 Win 32call 吗?