Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-57080
MAN-IN-RED
2002-02-01 19:36
2002.02.18
Как посмотреть нажата ли левая кнопка мыши?


1-57050
Елена
2002-02-04 11:12
2002.02.18
i1, i2, i3 и т.д.


3-57025
demon ltd
2002-01-25 00:10
2002.02.18
запись из базы в edit, Combobox1 и так даллее


14-57217
Merlin
2001-12-26 11:29
2002.02.18
Хороший программист характеризуется умением доказать почему задачу невозможно выполнить, когда ему просто лень её выполнять...


1-57060
Vlad@Delphi
2002-01-18 21:37
2002.02.18
Запуск внешних приложений из программ, созданных в Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский