Форум: "WinAPI";
Текущий архив: 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);
Еще раз СПАСИБО за помощь!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.02.18;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c