Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

передача данных/строк из Dll приложению   Найти похожие ветки 

 
VirEx ©   (2007-03-14 19:57) [0]

пробовал sendmessage через WM_COPYDATA, но при копировании в memo вылеатет AV.

//из DLL
function MyFoo(var buf; len, flags: Integer): Integer; stdcall;
var
 CDS:TCopyDataStruct;
 Dump:array[0..$FFFF] of Char;
...
Move(Dump, buf, len);
CDS.dwData := WM_MYDATASend;
CDS.cbData := Result;
CDS.lpData := @Dump;
sendmessage(FindWindow(nil,"TMain"),WM_COPYDATA,0,Integer(@CDS));
...

//в приложении
procedure TfrmMain.messages(var Msg: TMessage);
var
 s: PChar;
 CDS:TCopyDataStruct;
begin
CDS:=PCopyDataStruct(Msg.LParam)^;
s:=stralloc(CDS.cbData);
CopyMemory(@s,@CDS.lpData, CDS.cbData);
memo1.Lines.Add(s); //<-- при в переменной содержимое буфера, но вылетает AV


 
begin...end ©   (2007-03-14 20:30) [1]

> VirEx ©   (14.03.07 19:57)

> CDS.cbData := Result;
Что в Result? Длина?

> CopyMemory(@s,@CDS.lpData, CDS.cbData);
Собачки здесь лишние. Да и StrAlloc тоже ни к чему. Memo1.Lines.Add(PChar(CDS.lpData)).

Насколько я понимаю, данная DLL НЕ загружается в АП процесса, содержащего окно TMain? Иначе, если загружается, то я не совсем понимаю, зачем здесь вообще использовать WM_COPYDATA.


 
VirEx ©   (2007-03-14 20:51) [2]


>  [1] begin...end ©   (14.03.07 20:30)

CDS.cbData := len; забыл исправить

данная DLL внедряется в другую программу, и оттуда пересылает главному окну TMain данные перехваченной функции (вернее функции две, но не суть важно)

только что пробовал пересылать через FileMapping, ситуация такая же, главное приложение читает из файла строку, но при добавлении вылетает в AV


 
begin...end ©   (2007-03-14 21:10) [3]

> VirEx ©   (14.03.07 20:51) [2]

OK, ясно. Но что происходит, если заменить три последние строчки из [0] на код из [1]? AV остаётся?


 
VirEx ©   (2007-03-14 21:16) [4]


>  [3] begin...end ©   (14.03.07 21:10)

да


 
begin...end ©   (2007-03-14 21:25) [5]

> VirEx ©   (14.03.07 21:16) [4]

Данные в массиве Dump завершаются нулём? Для отладки можно пока заменить CDS.lpData := @Dump на CDS.lpData := "Test" и посмотреть, что окажется в memo.


 
begin...end ©   (2007-03-14 21:27) [6]

В смысле, на CDS.lpData := PChar("Test").


 
VirEx ©   (2007-03-14 21:30) [7]

и просто текст, и константы, и локальные переменные - одно и то же AV


 
VirEx ©   (2007-03-14 21:34) [8]

более того, если оправлять текст, константы, и локальные переменные, т.е.
CDS.lpData := PChar("Test")
CDS.lpData := LocalStr
CDS.lpData := ConstStr

в главной форме текста нет =-O


 
VirEx ©   (2007-03-14 21:57) [9]

что интересно, можно работать со строкой как угодно, но до момента добавления в мемо


 
VirEx ©   (2007-03-14 22:16) [10]

всё, заработался совсем :)
уже через маппинг файл:
procedure TfrmMain.messages(var Msg: TMessage);
begin
case Msg.WParam of
 WM_DATASend:begin
             RecData := MapViewOfFile(RecMMF, FILE_MAP_ALL_ACCESS , 0, 0, 0);
             memo1.Text:=RecData; <-- AV
...

посмотрел в объявление, и убрал stdcall ^)
...
type
 TfrmMain = class(TForm)
 ...
 private
   { Private declarations }
   procedure messages(var Msg : TMessage); message WM_MYDATA; //stdcall - вот причина ошибки
 public
   { Public declarations }
 end;

и всё заработало, спасибо всем


 
Rouse_ ©   (2007-03-14 22:38) [11]

Мдя...

function MyFoo(AHandle: THandle;
 var buf; len, flags: Integer): Integer; stdcall;
var
CDS: TCopyDataStruct;
Dump: array[0..$FFFF] of Char;
begin
 Move(buf, Dump, len);
 CDS.dwData := 0;
 CDS.cbData := SizeOf(Dump);
 CDS.lpData := @Dump;
 sendmessage(AHandle, WM_COPYDATA, 0, Integer(@CDS));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Buff: String;
begin
 Buff := "qwe";
 MyFoo(Handle, buff[1], Length(Buff), 0);
end;

procedure TForm1.WMCopyData(var Message: TWMCopyData);
begin
 ShowMessage(PChar(Message.CopyDataStruct^.lpData));
end;



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
15-1186321802
bagos
2007-08-05 17:50
2007.09.02
Господа помогите найти


9-1159030536
glscener
2006-09-23 20:55
2007.09.02
[GLScene] Нужна консультация


2-1186920066
•batya•
2007-08-12 16:01
2007.09.02
Использование не зарегестрированных шрифтов


15-1186415763
SkySpeed
2007-08-06 19:56
2007.09.02
Какую посоветуете программу для восстановления удалённых файлов?


15-1186049365
DelphiN!
2007-08-02 14:09
2007.09.02
Делфовый аналог Copy, pos в JavaScript