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

时间:2014-01-06 20:02:28

标签: delphi

我想在我的程序中广播一些环境变量的变化。因此,其他一些实用程序可以使用新值。 当我在Windows 7平台上编译32位Delphy XE4中的下一个例程时,一切似乎都能正常工作。 当我将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;

2 个答案:

答案 0 :(得分:7)

您需要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;

答案 1 :(得分:6)

感谢。这有帮助,但最终的诀窍是将aResult初始化为nil。实际上下一个代码可以工作:

procedure BroadcastChange;
    var
        aResult          : PDWORD_PTR;            
    begin
        aResult  := nil;  {<---}
        SendMessageTimeout(HWND_BROADCAST ,
                           WM_SETTINGCHANGE ,
                           0, 
                           LPARAM(PChar('Environment')), 
                           SMTO_NORMAL  ,
                           4000,
                           aResult
                           );
    end;