【问题标题】:SendMessageTimeout in Delphi XE4 64-bit produces Access violationDelphi XE4 64 位中的 SendMessageTimeout 产生访问冲突
【发布时间】:2014-01-07 05:12:39
【问题描述】:

我想在我的程序中广播一些环境变量的变化。因此,其他一些实用程序可以使用新值。 当我在 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;

【问题讨论】:

    标签: delphi


    【解决方案1】:

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

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

    由于你不使用 aResult,所以传递 nil。你未初始化的指针显然是个问题。

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

    【讨论】:

      【解决方案2】:

      谢谢。这有帮助,但最终的诀窍是将 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多