Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Cpp -> Delphi Data Transform

Дрова!

Есть проблема:

Есть ЕхЕ-шник, который мы сами компилим на Срр Builder'e
и
Есть ЕхЕ-шник, который мы сами компилим на Delphi
Cpp'шный Ехе-шник выдает инфу (каждый раз разная), а Дельфовский Ехе-шник должен
эту инфу обрабатывать...

Коим образом можно забрать инфу с Срр'шного ЕхЕ-шника на ЕхЕ-шник, сделаный на
Дельфе

Т.е. в обе проги мы можем вставлять любые програмные строки (коды), можем выводить
инфу как заглавие форм и т.д., короче делать все, что угодно :-)

Рассматриваются любые предложения :-) х Если не лень, то с примерами х

Ответить   -=BorMaN=- Sat, 13 Mar 2004 13:39:48 +0200 (#102040)

 

Ответы:

Тема: Cpp -> Delphi Data Transform

на

Проще всего через карман Виндов TClipboard - там у обоих есть методы и свойство
AsText
Механизм передачи: подать сообщение SendMessage или PostMessage с помощью WM_USER+константа
одинаковая у обоих. Когда приложение получает такое сообщение (OnMessage), оно
должно заглянуть в карман и прочитать

Если просто цифру, то можно передать в виде WMUSER+константа, и wParam и lParam

Можно через файл с общим доступом, тут удобны файлы, отображаемые на память (CreateFileMapping)

Можно и дать возможность одной программе "заглянуть" в свое адресное пространство,
но хлопот тут побольше.
Сейчас отвечать подробнее некогда :(( - не разберешься напиши. Объясню

Ответить   Sat, 13 Mar 2004 17:52:27 +0300 (#102084)

 

Здравствуйте !

Гм... А поподробнее можно ? Какова задача ?
Мне это немного напоминает задачу обмена данными между процессами.
Если надо много инфы, то можно поискать по словам "Interprocess
communication".

Навскидку есть несколько методов решения проблемы.
Это использование :

1. MMF (Memory mapped files) - файлы, отображенные на память.
2. Сообщений WM_COPYDATA (винда делает через MMF).
3. Shared Memory (общая память) - разделенная между процессами (реализована
виндами как MMF).
4. Буфер обмена (Clipboard).
5. Технологий COM.
6. Named Pipes (именованные каналы) - процессы могут быть на разных компах
в сети. Надо хотя бы одну машину с Win NT/2000/XP.
7. Unnamed Pipes (неименованные каналы).
8. Сокетов (должно быть установлено TCP IP).
9. Mail slots (почтовые слоты) - также надо TCP.
10.Перехват потоков ввода/вывода дочернего процесса (если один процесс
запустит другой, то первый может подсунуть второму свои дескрипторы
потоков stdin/stdout/stderr.
11.Технологии RPC, удаленный вызов процедур.
12.Запись напрямую в адресное пространство другого процесса с помощью
WriteProcessMemory (и еще синхронизация не помешала бы).

Выбирайте, короче, подходящий :-)

--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru
Номер выпуска : 2582
Возраст листа : 173 (дней)
Количество подписчиков : 377
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/102212
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sat, 13 Mar 2004 22:12:16 +0300 (#102212)

 

Прошу прощения, это точно?

Товарищ, плиз....

Плиз, настрой у себя в темплейтах, что бы последней строкой было
два минуса пробел и Ентер
типа так

Ответить   Sat, 13 Mar 2004 22:26:23 +0300 (#102228)

 

Здарова, -=BorMaN=-!

13 марта 2004 г., суббота, 16:39:48 (GMT+05:00), ты намылил:

на

выводить

Зря ты программерам пишешь "Если не лень" ;), сразу так лень
становиться :')

Самое простое - пнуть в прогу сообщением, например:
WM_IWRITEFUCKINGINFORMATION ;)
На которое принимающая прога должна среагировать, например, чтением
определенного файла.

Держи статейку (она не много не о том, но мысля нужная тебе есть):

Как определить работает ли уже данное приложение или это его первая копия?

Последнее изменение: 15 авг 2001 (среда), 15:06:26


Как определить работает ли уже данное приложение или это его первая копия? *
*
Каждый экземпляр программы имеет ссылку на свою предыдущую копию - hPrevInst:
hWnd.
Ее можно проверить перед созданием приложения и при необходимости отреагировать

соответствующим образом. Если запущена только одна копия, то эта ссылка равна
нулю.
Только для Delphi 1.
Пример использования hPrevInst:
procedure TForm1.FormCreate(Sender: TObject);
begin
// Проверяем есть ли указатель на предыдущую копию приложения
IF hPrevInst <> 0 THEN BEGIN
// Если есть, то выдаем сообщение и выходим
MessageDlg('Программа уже запущена!', mtError, [mbOk], 0);
Application.Terminate;
END;
// Иначе - ничего не делаем (не мешаем созданию формы)
end;

Другой способ - по списку загруженных приложений
procedure TForm1.FormCreate(Sender: TObject);
VAR
Wnd : hWnd;
buff : ARRAY[0.. 127] OF Char;
Begin
//Получили указатель на первое окно
Wnd := GetWindow(Handle, gw_HWndFirst);
// Поиск
WHILE Wnd <> 0 DO BEGIN
// Это окно предыдущей копии ?
IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0)
THEN BEGIN
GetWindowText (Wnd, buff, sizeof (buff ));
IF StrPas (buff) = Application.Title THEN
BEGIN
MessageDlg('Приложение уже загружено', mtWarning, [mbOk], 0);
Halt;
END;
END;
Wnd := GetWindow (Wnd, gw_hWndNext);
END;
End;

Данный пример не всегда применим - часто заголовок приложения меняется при каждом
старте, поэтому рассмотрим более надежный способ - через FileMapping
Дело в том, что можно в памяти создавать временные файлы. При перезагрузке они

теряются, а так существуют. Кстати, этот метод можно использовать и для обмена

информацией между вашими приложениями.
Пример с использованием FileMapping:

program Project1;
uses
Windows, // Обязательно
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}
Const
MemFileSize = 1024;
MemFileName = 'one_inst_demo_memfile';
Var
MemHnd : HWND;
begin
// Попытаемся создать файл в памяти
MemHnd := CreateFileMapping(HWND($FFFFFFFF),
nil,
PAGE_READWRITE,
0,
MemFileSize,
MemFileName);
// Если файл не существовал запускаем приложение
if GetLastError<>ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
CloseHandle(MemHnd);
end.

Часто при работе у пользователя может быть открыто 5-20 окон и сообщение о том,
что
программа уже запущено приводит к тому, что он вынужден полчаса искать ранее
запущенную
копию. Выход из положения - найдя копию программы активировать ее, для чего в
последнем
примере перед HALT необходимо добавить строку :
SetForegroundWindow(Wnd);
Пример:

program Project0;
uses
Windows, // !!!
Forms,
Unit0 in 'Unit0.pas' {Form1};

var
Handle1 : LongInt;
Handle2 : LongInt;

{$R *.RES}

begin
Application.Initialize;
Handle1 := FindWindow('TForm1',nil);
if handle1 = 0 then
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
Handle2 := GetWindow(Handle1,GW_OWNER);
//Чтоб заметили :)
ShowWindow(Handle2,SW_HIDE); ShowWindow(Handle2,SW_RESTORE);
SetForegroundWindow(Handle1); // Активизируем
end;
end.

Блокировка запуска второй копии при помощи Mutex На мой взгляд, это
один из самых простых и надежных способов.

procedure TForm1.FormCreate(Sender: TObject);
var
hMutex : THandle;
begin
hMutex := CreateMutex(0, true , 'My application name');
if GetLastError = ERROR_ALREADY_EXISTS then begin
CloseHandle(hMutex);
Application.Terminate;
end;
end;

В данном примере при старте приложения создается мьютекс с некоторым уникальным

именем (у каждого приложения оно должно бять свое !!). Если хоть одна копия
приложения запущена, то в системе уже будет мьютекс с таким именем и возникнет

ошибка ERROR_ALREADY_EXISTS. В противном случае мьютекс создается и существует,
пока работает данная копия приложения Задать вопрос

--
Никогда больше не буду говорить афоризмами. Да, кстати, запишите мою последнюю
фразу

Ответить   Томилов Александр Sun, 14 Mar 2004 00:59:47 +0500 (#102383)

 

Здравствуй, -=BorMaN=-.

Вы писали 13 марта 2004 г., 13:39:48:

должен

на

Если я тебя понял правильно - проблема заключается в том, чтобы
передать данные из одного EXE-файла в другой. Верно? Если так, то
советую использовать проецируемые в память файлы, так как с их помощью
строятся практически все механизмы совместного доступа процессов к
данным (например RPC, COM, OLE, DDE, оконные сообщения, буфур обмена и
т.д.). Проецируемые в память файлы - это самый низкоуровневый механизм и,
соответственно, самый быстрый.
Последовательность действий такова:

В Cppшном EXEшнике:

//Создаёшь проецируемый в память файл
s_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE, 0, 4 * 1024, TEXT("MMFSharedData"));

//проецируешь на адресное пространство
PVOID pView = MapViewOfFile(s_hFileMap,
FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);

//Дальше помещаешь свои данные в буффер по адресу указаном в pView

//И прекращаешь проецирование
UnmapViewOfFile(pView);

В Delphi:

//Открываешь файл проецируемый в память
hFileMapT := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE,
FALSE, 'MMFSharedData');

pView := MapViewOfFile(hFileMapT,
FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, 0);

//забираем данные из буффера по адресу указаном в pView

//И прекращаешь проецирование
UnmapViewOfFile(pView);

Выдрал из одного примера на работоспособность не проверял но
теоретически должно работать. Ну к этому, для коректности, необходимо
добавить проверки различные - думаю разберёшься (если захочешь).
Надеюсь поможет.

Ответить   Пастернак Сергей Mon, 15 Mar 2004 11:57:49 +0200 (#103234)

 

Здравствуйте, -=BorMaN=-.

Вы писали 13 марта 2004 г., 14:39:48:

должен

на

выводить

а че ты через файлы не хочешь?

Ответить   Tue, 16 Mar 2004 09:09:01 +0300 (#104413)

 

-=[Бодрого времени сУток!]=-
16 марта 2004 г. /вторник 8:09:01/ front.ru |E-Mail: <mailto:ksv***@f*****.ru>|
в мессаге <<Cpp -> Delphi Data Transform>> накрапал:
[B~E~G~I~N~>
front.ru> Здравствуйте, -=BorMaN=-.

front.ru> Вы писали 13 марта 2004 г., 14:39:48:

~~~<!Поскипано-CENSORED!>front.ru> а че ты через файлы не хочешь?


[E|.|N|.|D|.>

Да просто думаю выбрать наиболее оптимальный вариант!

Ответить   -=BorMaN=- Tue, 16 Mar 2004 20:48:37 +0200 (#104545)