Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
15-1146566297
DelphiN!
2006-05-02 14:38
2006.05.28
Как сделатиь перехватчик фатальных ошибок в программе


8-1135718806
woto
2005-12-28 00:26
2006.05.28
Для тех кто работал с graphics32


5-1132555632
Mishenka
2005-11-21 09:47
2006.05.28
Где хранить ImageList?


10-1119957904
An
2005-06-28 15:25
2006.05.28
DDE


2-1147099014
Mr tray
2006-05-08 18:36
2006.05.28
узнать объект в чужом окне, на котором (объекте) сейчас фокус





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