Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > WM_COPYDATA и ошибки


Автор: Voyager 4.2.2006, 23:26
Надо передать из dll в другую программу строку данных, пишу на WinAPI, передаю так:
dll:
Код

var
cd: TCopyDataStruct;
s: PChar;
wnd: HWND;

begin
    wnd:=FindWindow('MONITOR', nil);
    s:='My dear window i sent the message';
    cd.dwData:=2048;
    cd.cbData:=Length(s)+1;
    cd.lpData:=s;
    SendMessage(wnd,WM_COPYDATA, 0 ,longint(@cd));
end.


Программа:
Код

function WndMessageProc(hWnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
var
  str:pchar;
...
WM_COPYDATA:
                case PCopyDataStruct(LParam)^.dwData of
                    2048:
                        begin
                            move(PCopyDataStruct(LParam)^.lpData,str,PCopyDataStruct(LParam)^.cbData);
                            MessageBoxA(0, Pchar(str),Pchar(inttostr(Length(str))),0);
                        end;
                end;

Программа вроде нормально получает строку, выдает ее в MessageBox, а потом выскакивает окно c Runtime error 216 и программа вылетает. В чем может быть проблема? smile

Автор: MBo 5.2.2006, 10:08
Нужно выделить память под str и в Move использовать разыменованные указатели str^ и lpData^

Автор: Romikgy 6.2.2006, 13:00
Код

function WndMessageProc(hWnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
var
  str:pchar;
...
WM_COPYDATA:
                case PCopyDataStruct(LParam)^.dwData of
                    2048:
                        begin
                            //move(PCopyDataStruct(LParam)^.lpData,str,PCopyDataStruct(LParam)^.cbData);
                            MessageBoxA(0, PCopyDataStruct(LParam)^.lpData,PCopyDataStruct(LParam)^.cbData,0);
                        end;
                end;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)