Главная страница
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.48 MB
Время: 0.027 c
3-1144133389
Cybernik
2006-04-04 10:49
2006.05.28
Проблемы с IBQuery. Мистика какая-то..


3-1144105635
djmixer
2006-04-04 03:07
2006.05.28
При интенсивной работе с таблицами Paradox, они начинают умирать


2-1147245283
Id
2006-05-10 11:14
2006.05.28
Пользователи базы данных


15-1146726507
Серебров Евгений Леонидович
2006-05-04 11:08
2006.05.28
Delphi 7


3-1144404362
eugenemail1970
2006-04-07 14:06
2006.05.28
Логическое поле в БД Access средствами SQL?