Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.18;
Скачать: [xml.tar.bz2];




Вниз

Нужна помощь 


YUS   (2001-12-12 20:43) [0]

Не могу передать имя ярлыка с помощью ф-ции SendMessage.Предложеный Delirium вариант работает, если s:="привет". Подскажите, где ошибка. Делаю так:

function kView:string;
var
nItems:cardinal; //номер ярлыка
TextToSet: PChar; S:String;
p:TPoint; buffer: array [0..127] of char; Item:integer;
begin
p.x:=0; p.y:=0;
nItems:=ListView_GetItemCount(hStol);
for Item:= 1 to nItems do
begin
ListView_GetItemText(hStol,Item,0,buffer,sizeof(buffer));
s:=buffer;
SendMessage(findwindow(nil,PChar("Form1")), WM_IName, 0, Integer(Pchar(s)));
end;
end;
Получаю имя ярлыка :

procedure TForm1.OnMyMessage(var Msg:TMessage);
var S:String;
begin
S:=String(Msg.LParam);
ListBox1.items.Add(S);
end;



Delirium   (2001-12-12 20:51) [1]

Чего ты хочешь сделать-то объясни по человечески



YUS   (2001-12-12 21:32) [2]

Я установил хук в explorer. С помощью function kView:string; узнаю координаты и имена ярлыков.Координаты передаются ф-цией SendMessage без проблем, а вот имена ярлыков передать не получается.Выдает ошибку при получении данных. Если s:=buffer; заменить на s:="Привет", "Привет"- передается без ошибок. В чем у меня ошибка?



Delirium   (2001-12-13 11:11) [3]

Попробуй

s:=String(buffer);




Dimka Maslov   (2001-12-13 14:08) [4]

function kView:string;
var
nItems:cardinal; //номер ярлыка
p:TPoint; buffer: array [0..127] of char; Item:integer;
begin
p.x:=0; p.y:=0;
nItems:=ListView_GetItemCount(hStol);
for Item:= 1 to nItems do
begin
ListView_GetItemText(hStol,Item,0,buffer,sizeof(buffer));
SendMessage(findwindow(nil,PChar("Form1")), WM_IName, 0, Integer(@buffer[0]));
end;
end;


Получаю имя ярлыка :


procedure TForm1.OnMyMessage(var Msg:TMessage);
begin
ListBox1.items.Add(PChar(Msg.lParam));
end;



YUS   (2001-12-13 15:20) [5]

Спасибо, попробую. А s:=String(buffer);- прбовал не подхотит.



YUS   (2001-12-13 18:14) [6]

Этот способ тоже не работает.



erik   (2001-12-13 22:39) [7]

Если у тебя разные процессы то на делать MemoryMapedFile или через именованый pipe(только на NT). Если нет то PostMessage(...,Integer(Self))



YUS   (2001-12-14 06:58) [8]

А пример можно?



nikkie   (2001-12-14 09:48) [9]

>YUS
по поводу твоего предыдущего вопроса такие дебаты были, а чем ты слушал - непонятно. тебе же русским языком сказали, что передать данные между процессами с помощью SendMessage можно только сообщением WM_COPYDATA.

есть и другие способы (например, как erik говорит), но WM_COPYDATA - самое простое.



YUS   (2001-12-14 22:22) [10]

WM_COPYDATA , что обсуждалась на прошлых дебатах, вопервых я не смог компилировать , а вовторых приведенный мной пример, как я уже говорил string передает, но если s="sbcdef";в моем случае выдает ошибку при передачи.
Буду разбираться, в крайнем случае зашифрую , а потом дешифрую.Спасибо еще раз всем, кто мне помогал.



Raptor   (2001-12-15 20:36) [11]

Привет!

Если тебе WM_COPYDATA не подходит то делай так.

При установке хука в ДЛЛ делаешь так

const
FileMapUniID = "Unique ID {6F392C03-DCE8-461D-BC33-639D14FDF2BB}";

type
PData = ^TData;
TData = record
Buffer:Array [0..255] Of Char;
end;

var
Data:PData;
HFileMap:THandle;

procedure CreateFileMap;
begin
HFileMap := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TData), FileMapUniID);
Data := MapViewOfFile(HFileMap, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TData))
end;

В приложении, которому будут посылаться сообщения, делаешь тоже самое.
В окне этого приложение описывешь обработку месаджа, например WM_USER+12321.
Кратко протокол пересылки таков.
Хук пишет то, что ему надо в Buffer и посылает окну приложения сообщение WM_USER+12321. В обработчике этого сообщения
приложение может делать с даными в Buffer все что ему вздумается.
В общем все. Правда, при закрытии приложения и снятии хука не забудь освободить хендлы

Procedure DisposeFileMap;
Begin
UnMapViewOfFile(Data);
CloseHandle(HFileMap);
End;

Raptor.



YUS   (2001-12-17 06:11) [12]

Raptor Привет!
Извини за тупой вопрос(с буфером я никогда не работал) как скопировать в буфер , взать оттуда и что делает procedure CreateFileMap.



Raptor   (2001-12-19 01:15) [13]

Привет!

Да-ааа. Вопрос и в самом деле тупой. :-))
Если ты не знаешь как с массивами в Делфи работать, то тебе надо не API, а паскаль подучить. Buffer - это простой масив символов. Пишешь и читаешь из него как из любого другого массива.
Если конкретно для строк, то можна сделать так:

var
Buffer:Array [0..255] Of Char;
s:String;
p:PChar;

Заносим строку s в Buffer:
s:="Hello";
p:=@Buffer;
p:=PChar(s);

Достаем строку s из Buffer:
p:=@Buffer;
s:=p;

Функция CreateFileMap создает разделяемую область в памяти. В эту область могут писать и читать из нее разные процессы. В твоем примере это хук, который находится в експлорере, и твоя вторая прога, которая должна получать от него даные (строки).

Raptor.



Dimaond Cat   (2001-12-19 01:36) [14]

проблема собственно в том что передавая сообщения так как передаешь его ты та передаешь не сам текст а его адрес в адресном пространстве твоего приложения, соответственно если твое сообщение принимает другое приложение со своим адресным пространством , то по полученному адресу оно находит черте-что, а переслать непосредственно текст можно так
var
Cds: TCopyDataStruct;
begin
listbox1.ItemIndex:=listbox2.Itemindex;
Cds.lpData:=pchar("проба");
SendMessage (handle интересующего нас окна,WM_settext,0,Cardinal(Cds.lpData) );
end;
правда в данном примере есть засада сообщение wm_settext приходит например к форме в момент ее создания и содержит в себе caption окна так что если ты отправляешь сообщение на хендл окна формы то нужно перестраховаться примерно так

procedure TForm1.OnMyMessage(var Msg:TMessage);
var S:String;
begin
if Visible then begin
S:=String(Msg.LParam);
ListBox1.items.Add(S)
else inherited;
end;



YUS   (2001-12-19 19:53) [15]

Привет!
Вообще-то я с массивами работал, но с буфером ни разу, хотя и догадывался, что это массив. Raptor Спасибо за подсказку работы с буфером (использую не сейчас ,так в будущем). Я попробовал использовать пример Dimaond Cat , все работает ( даже если не использовать CopyDataStruct ), единственная проблема: после каждого сообщения выводит " Invalid pointer operation " нажимаешь "ОК" выводит следующее имя ярлыка и вновь ошибка. В чем причина?



YUS   (2001-12-19 20:28) [16]

Всем БОЛЬШОЕ СПАСИБО !
Dimaond Cat - твой пример работает . С ошибкой разобрался, нужно
S:=Pchar(Msg.LParam);
Еще раз СПАСИБО за помощь!




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.016 c
7-57234           REL                   2001-11-09 11:37  2002.02.18  
Логическая задачка (не могу справиться)


1-57106           kaif                  2002-02-02 16:07  2002.02.18  
Доступ к закрытым членам


1-57064           BAS                   2002-02-01 13:52  2002.02.18  
Подсветка слов в TReachEdit


1-57048           Елена                 2002-02-04 11:52  2002.02.18  
Гориз. полоса прокрутки в ComboBox


1-57137           Иля                   2002-02-03 13:39  2002.02.18  
Automation objec