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

Вниз

Есть две программы, надо из одной в другую передать строку?   Найти похожие ветки 

 
dracula ©   (2006-04-17 13:10) [0]

Допустим есть программа при запуске которой она определяет запущена её копия или нет, и если запущена то она должна передать содержимое командной строки первой копии. В первый раз столкнулся с такой проблемой, и незнаю в какую сторону копать? Плз. подскажите знающие люди. Заранее спасибо.


 
Дмитрий Л. ©   (2006-04-17 13:18) [1]

дарю:

program Project1;

uses
 windows,
 SysUtils,
 Forms,
 Unit1 in "Unit1.pas" {Form1};

{$R *.res}

var
 InstExists: Boolean;
begin
 NewInstMessageValue:=RegisterWindowMessage(Pchar(UniqueName+"msg"));
 if NewInstMessageValue=0 then
   RaiseLastOSError;
 hSection:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, DATA_SIZE, Pchar(UniqueName+"map"));
 if hSection=0 then
   RaiseLastOSError();
 InstExists:=GetLastError=ERROR_ALREADY_EXISTS;
 try
   lpCustomData:=MapViewOfFile(hSection, FILE_MAP_ALL_ACCESS, 0, 0, DATA_SIZE);
   if lpCustomData=nil then
     RaiseLastOSError;
   if InstExists then
   begin
     if (ParamCount>0) and (Length(ParamStr(1))>0) then
       CopyMemory(@(lpCustomData^.Buffer), @Paramstr(1)[1], Length(Paramstr(1)));
     SendMessage(lpCustomData^.ClientHandle, NewInstMessageValue, GetCurrentProcessId, GetCurrentThreadId);
   end
   else
   begin
     Application.Initialize;
     Application.CreateForm(TForm1, Form1);

     ZeroMemory(lpCustomData, DATA_SIZE);
     lpCustomData.ClientHandle:= Form1.Handle;
     Application.Run;
   end;
 finally
   if lpCustomData<>nil then
     UnmapViewOfFile(lpCustomData);
   CloseHandle(hSection);
 end;
end.

////////////////////////////////////

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
 protected
   procedure WndProc(var Message: TMessage); override;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const
 DATA_SIZE = 1024;

type
 TCustomData = packed record
   ClientHandle: THandle;
   Buffer: array [0..DATA_SIZE-SizeOf(THandle)-1] of char;
 end;
 PCustomData = ^TCustomData;

const
 UniqueName = "AppNotificationNameSpace";

var
 Form1: TForm1;
 hSection: DWORD;
 NewInstMessageValue: DWORD;
 lpCustomData: PCustomData;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.WndProc(var Message: TMessage);
begin
 inherited;
 if Message.Msg=NewInstMessageValue then
 begin
   ShowMessage(Format("New instance running: PID: %d, TID: %d, Param: %s",
               [Message.WParam, Message.LParam, Pchar(@(lpCustomData.Buffer))]));
   ZeroMemory(@(lpCustomData^.Buffer), SizeOf(lpCustomData^.Buffer));
 end;
end;

end.


 
TUser ©   (2006-04-17 13:24) [2]

Посмотри в сторону Wm_CopyData


 
Dmitrij_K   (2006-04-17 13:25) [3]

WM_COPYDATA


 
Dracula ©   (2006-04-17 13:27) [4]

Спасибо, сейчас буду пробовать...


 
Сергей М. ©   (2006-04-17 13:27) [5]


> в какую сторону копать?


Если взаимодействующие программы используют GUI, то можно копнуть в сторону сообщений WM_COPYDATA.
В противном случае как альтернатива [1] - см. NamedPipes.


 
Дмитрий Л. ©   (2006-04-17 13:45) [6]

В [1], конечно, представлен не единственно возможный метод. Но в случае с Wm_CopyData  основная проблема в том, не как передать данные, а кому. В данном случае сложно обойтись без именованных каналов, MMF или LPC, т.к. FindWindow  не гарантирует верный результат, а EnumWindows+GetWindowThreadProcessId - не самое красивое решение, ибо цикл.


 
Dracula ©   (2006-04-17 13:55) [7]

Дмитрий Л. спасибо, твой код как раз то что надо, уже всё работает огромное СПАСИБО!



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

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

Наверх




Память: 0.47 MB
Время: 0.011 c
6-1138388766
KLAUS
2006-01-27 22:06
2006.05.28
Ошибка сценария Interner Explorer


2-1147461468
Viconia
2006-05-12 23:17
2006.05.28
Посмотрите, плиз, запрос...


15-1146319065
dyd
2006-04-29 17:57
2006.05.28
Удаленная работа


15-1146583222
Новичоккк
2006-05-02 19:20
2006.05.28
Математическая задачка


4-1141297063
MaxLMN
2006-03-02 13:57
2006.05.28
RichEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский