Имя: Пароль:
IT
 
OFF: Delphi, передача строки между приложениями
0 vde69
 
03.09.09
15:29
отправляю:
---------------------------------------------------
var
 MemHnd : HWND;
 AText: PChar;

begin
....
....
....
       AText := 'Vasi';
       SendMessage(HWND_BROADCAST, WM_OURMESSAGE, Length(AText) * SizeOf(Char), LParam(@AText));
       sleep(500);
....
....

----------------------------------------------

принимаю:

-----------------------------------------------

procedure TSDIAppForm.DefaultHandler(var Message);
var
  FilenameForOpening: string;
  s: string;
begin
  with TMessage(Message) do
  begin
     if (Msg = WM_OURMESSAGE) then
       begin
             SetLength(FilenameForOpening, WParam div SizeOf(Char));
             p := Ptr(LParam);
             Move(PChar(p^), PChar(FilenameForOpening)^, WParam);
             s := FilenameForOpening; // вот тут "#0#0#0#0" ?????
             s := s + ' ';
       end
....
....
....

initialization
  WM_OURMESSAGE := RegisterWindowMessage('Add_1c+_Server_block');


-------------------------------------------------
туплю уже давно, все примеры из инета перепробовал, нифига не переносит...

может дело в типе мессаге? может пользовательские так не работают?
1 H A D G E H O G s
 
03.09.09
15:35
Ну и как ты обратишься к Чужому адресу???
2 H A D G E H O G s
 
03.09.09
15:35
ППЦ
3 H A D G E H O G s
 
03.09.09
15:35
Адресация то разная.
4 vde69
 
03.09.09
15:36
(1) почитай http://www.delphikingdom.com/asp/answer.asp?IDAnswer=68007

я и сам понимаю проблемму, но не понимаю как у НИХ работает?
5 H A D G E H O G s
 
03.09.09
15:36
LParam(@AText) - адрес (числом, например $FC01FC01) в 1-ом приложении
p := Ptr(LParam);  - адрес (числом, например $FC01FC01) во втором приложении
6 H A D G E H O G s
 
03.09.09
15:37
У них - WCopyData - спец сообщение Винды.
7 H A D G E H O G s
 
03.09.09
15:38
WM_COPYDATA захелпь в Win SDK
8 H A D G E H O G s
 
03.09.09
15:40
GlobalAddAtom()
попробуй
9 H A D G E H O G s
 
03.09.09
15:43
Ты здесь вообще?
Чего ты там такого глобального строгаешь?
10 vde69
 
03.09.09
15:44
(9) строгаю сервер административного запрета запуска 1с
11 v77
 
03.09.09
15:44
(4) ну дак ты делай как там, а не как сам придумал :)))
намёк
CDS:TCopyDataStruct
12 H A D G E H O G s
 
03.09.09
15:46
(10) Да вы программист (типа - ответ есть, он верен, но абсолютно не понятен). :-)
13 Salvador Limones
 
03.09.09
15:48
(10) Хммм... А расскажи принцип действия!
14 v77
 
03.09.09
15:50
(13) здесь всё написано
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=68007
15 vde69
 
03.09.09
15:50
(13) я только для своего собственого стартАпа, сервер будет создавать определенный файл в каталоге с базой и держать на нем блокировку, а стартап не будет давать запустить если такая ситуевина
16 v77
 
03.09.09
15:50
просто он вместо адреса структуры передает адрес строки
17 Salvador Limones
 
03.09.09
15:52
(15) О, ясно! А контроль за запуском через хук?
18 vde69
 
03.09.09
15:55
(17) вот к этому http://www.infostart.ru/projects/2836/ приделываю
19 MMF
 
03.09.09
16:02
обычно для межпроцессового обмена используют отображение файла в память
20 H A D G E H O G s
 
03.09.09
16:05
(19) Ага.
А еще можно UDP/TCP заюзать.
Нафиг этот изврат?
MS дала инструмент
WM_COPYDATA,
так что его не пользовать то?
21 Капитан Смоллет
 
03.09.09
16:06
(15) Еще одна защита?
22 Salvador Limones
 
03.09.09
16:09
(18) А чего там за прикол - "в связи с борьбой за лицензионную чистоту"?
23 H A D G E H O G s
 
03.09.09
16:11
(22) В аську!
25 vde69
 
03.09.09
16:14
(23)(22) да нету тут секретов, просто есть некоторые споры, что лезть в процессы 1с нельзя (и тот же 1с++ попадает под эти заморочки), то я не юзаю ничего, что можно расценить как декомпеляция, внедрение кода и т.д.
28 Torquader
 
04.09.09
00:13
На самом деле можно использовать ClipBoard или просто глобальную память.
hGlobal=GlobalAlloc(GPTR,Размер);
Pointer=GlobalLock(hGlobal);
CopyMemory(Pointer,НашУказатель,Размер);
GlobalUnLock(Pointer);
SendMessage(ДругоеПриложение,WM_USER,Размер,(LPARAM)hGlobal);

В другом приложении:
Pointer=GlobalLock(lParam);
CopyMemory(НовоеМесто,Pointer,wParam);
GlobalUnLock(Pointer);
GlobalFree(lParam);

Где-то так.
29 Андрюха
 
04.09.09
05:00
(0) А я через NamedPipes