2014-01-06 51 views
3

我想在我的程序中广播几个环境变量的变化。所以其他一些公用事业公司可以利用新的价值。 当我在Windows 7平台上编译32位Delphy XE4中的下一个例程时,一切似乎都正常。 当我将Delphy切换到64位平台时,调试器会产生访问冲突。德尔福XE4 64位SendMessageTimeout产生访问冲突

有什么建议吗?


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; 

回答

7

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

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

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

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

谢谢。这有帮助,但最终的诀窍是初始化aResult为零。其实下代码的作品:

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

啊。我错过了它是一个指针而不是var参数。 –