我有两个窗体Form1,Form2
Form1是一个开多线程的窗体,Form2中定义了一个函数向别的软件发送消息的
Form1中代码是这样的:            CS.Enter;//进临界
              while not Form2.changproxy() and IsSt do sleep(300);
            CS.Leave;
Form2中函数是这样的
function TTpFom.changproxy():boolean ;
var
WndCaption: array[0..100] of Char;
begin
result:=false;
SendMessage(Hwnd4, WM_GETTEXT, 1024, Integer(@WndCaption));
if string(wndCaption)<>''then
result:=true;
end;
原先Form1不使用多线程执行很正常从来没出过问题,现在换成多线程了就出问题了 WndCaption新打开的时候能取到值,运行一会儿就取不到值,有时根本就取不到值.不知道这是什么问题,后来我用 后来我不用数组用Pchar就没有问题能正常取值,
getmem(buf,len);
SendMessage(Hwnd4,WM_GETTEXT,Len+1,Int64(buf));
请问一下我这种情况是什么原因产生的.好像是数组存不进值似的

解决方案 »

  1.   

    1. 首先代码很乱.
    2. 其次Form2代码中指定缓冲区是101个字符. 但是sendmessage 确传入1024, 这会导致不定的错误.
    3. 不要用String(wndCaption)来强制转换, 不是一样的东西.
    4. 你要取值,请用StrPas(wndCaption)
      

  2.   

    谢谢Hexpate的回答
    你说的第二个问题确实存在,因为取得的字不会超过50个字,所以从来没出过错,本身是有问题,谢谢你的提点以后改正主要是我为什么用线程调用就会有取不值的情况,在form1主线程中调就不会有这个问题,请告诉一下这个问题要怎么解决,谢谢
      

  3.   

    你贴出的代码暂时无法看出你的问题在什么地方, 除了我上面讲的, Hwnd4是哪里来的? 另外你是怎么知道没有获取正确的值? 我看你的代码里并无将取出的标题拿在别的地方用, 不知道你的意图又在什么地方?
      

  4.   

    你贴出的代码暂时无法看出你的问题在什么地方, 除了我上面讲的, Hwnd4是哪里来的? 另外你是怎么知道没有获取正确的值? 我看你的代码里并无将取出的标题拿在别的地方用, 不知道你的意图又在什么地方?
      

  5.   

    你贴出的代码暂时无法看出你的问题在什么地方, 除了我上面讲的, Hwnd4是哪里来的? 另外你是怎么知道没有获取正确的值? 我看你的代码里并无将取出的标题拿在别的地方用, 不知道你的意图又在什么地方?
      

  6.   

    Hwnd4是别的函数赋值了
    SendMessage(Hwnd4, WM_GETTEXT, 1024, Integer(@WndCaption));
    只是在发送消息后WndCaption的值不变,还是全是0
      

  7.   

    你的问题我觉得是要先检查Hwnd4是否合法值, 也就是是不是正确的handle, 其次再去查别的问题, 我觉得和线程没有太大的关系, 顶多是线程执行这段代码的时候, 其他的函数还没有正确的设置Hwnd4的值
      

  8.   

    感谢你的回答,你提出的第二个问题,我改了以后到目前还没有出现问题,我感觉是不是在单线程的时候
    SendMessage(Hwnd4, WM_GETTEXT, 1024, Integer(@WndCaption));
    内存不出错,在多线程的时候会造成内存乱了,有内存有保护所以写不进WndCaption,
    Hwnd4绝对没有问题,别的方法能取,有的时候第一次能取第二次就不能,我感觉跟那大小有关不知道你的看法呢
      

  9.   

    按你的代码改写如下:
    function TTpFom.changproxy():boolean ; 
    var 
    WndCaption: array[0..100] of Char; 
    begin 
    result:=false; 
    SendMessage(Hwnd4, WM_GETTEXT, Length(wndCaption), Integer(@WndCaption)); 
    if string(wndCaption) <>''then 
    result:=true; 
    end; 
      

  10.   

    非常感谢你的热心帮助,不知道你对idhttp有没有研究,可不可以加我QQ请教一下:8814214