Обмен данными между .exe и .dll
От: shvank  
Дата: 18.01.03 12:03
Оценка:
Есть вопросик:

1) Есть экзешник, который дергает .dll
2).dll должна запускать другой экзешник, и получить из него некий объект.
3).dll отдает объект первому экзешнику.

Каким образом проще всего реализовать 2й этап? Ну, запустить-то я могу, а вернуть что-либо дллке...
Спасибо.

18.01.03 15:05: Перенесено модератором из 'C/C++' в WinAPI — ХД
Re: Обмен данными между .exe и .dll
От: DrMom  
Дата: 18.01.03 15:37
Оценка: 3 (1)
Здравствуйте, shvank, Вы писали:

S>Есть вопросик:


S>1) Есть экзешник, который дергает .dll

S>2).dll должна запускать другой экзешник, и получить из него некий объект.
S>3).dll отдает объект первому экзешнику.

S>Каким образом проще всего реализовать 2й этап? Ну, запустить-то я могу, а вернуть что-либо дллке...

S>Спасибо.

Ну можно, как самый простой вариант, грузить эту длл из запускаемого ею экзэшника. Дальше какую нить переменную глобальную в длл, делаешь общей для всех процессов эту длл грузящих и через нее передаешь данные. Это самый простой способ. Как вариант, можно также использовать файлы памяти (если не ошибаюсь в названии), pipes, WinSocket, но последние два это уже слишком.
Re: Обмен данными между .exe и .dll
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 18.01.03 15:53
Оценка:
Здравствуйте, shvank, Вы писали:

S>Каким образом проще всего реализовать 2й этап? Ну, запустить-то я могу, а вернуть что-либо дллке...


COM ?
... << RSDN@Home 1.0 beta 3 >>
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[2]: Обмен данными между .exe и .dll
От: DrMom  
Дата: 18.01.03 15:55
Оценка:
Здравствуйте, Anatolix, Вы писали:

A>Здравствуйте, shvank, Вы писали:


S>>Каким образом проще всего реализовать 2й этап? Ну, запустить-то я могу, а вернуть что-либо дллке...


A>COM ?


А не слишком ли это экстремально для такой мелочи COM объект писать?
Re[3]: Обмен данными между .exe и .dll
От: peterbes Россия  
Дата: 18.01.03 16:02
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>А не слишком ли это экстремально для такой мелочи COM объект писать?


Нет не экстремально. Размер dll слабо зависит от COM-а, зато головной боли меньше.
Re[4]: Обмен данными между .exe и .dll
От: DrMom  
Дата: 18.01.03 16:22
Оценка:
Здравствуйте, peterbes, Вы писали:

P>Здравствуйте, DrMom, Вы писали:


DM>>А не слишком ли это экстремально для такой мелочи COM объект писать?


P>Нет не экстремально. Размер dll слабо зависит от COM-а, зато головной боли меньше.


Да я не про размер, а про геморой написания COM объекта. Ведь можно просто обявить глобальную структуру и в нее писать при помощи memcpy из разных процессов. Так можно сделать минут за 5, а вот с COM так не получится.
Re[5]: Обмен данными между .exe и .dll
От: peterbes Россия  
Дата: 18.01.03 16:33
Оценка:
Здравствуйте, DrMom

Я насабачился во всяких пересылках данных через COM. Это действительно удобно. Клиент спокойно жует объекты Сервера, так как если бы они были внутренними. Возни с комом правда меньше.
Re[5]: Обмен данными между .exe и .dll
От: MaximE Великобритания  
Дата: 18.01.03 16:35
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>>>А не слишком ли это экстремально для такой мелочи COM объект писать?


P>>Нет не экстремально. Размер dll слабо зависит от COM-а, зато головной боли меньше.


DM>Да я не про размер, а про геморой написания COM объекта. Ведь можно просто обявить глобальную структуру и в нее писать при помощи memcpy из разных процессов. Так можно сделать минут за 5, а вот с COM так не получится.


Не забываем про выравнивание. Как ты узнаешь какой нужен alignment данной структуре? Можно, конечно, пытаться всегда скопировать по адресу, гарантированно обеспечивающему корректность любого alignment (как, например, при использовании file mapping (он всегда проецируется с адреса, кратного гранулярности на данной платформе)), но, IMHO, это моветон .
Re[6]: Обмен данными между .exe и .dll
От: DrMom  
Дата: 18.01.03 16:38
Оценка:
Здравствуйте, peterbes, Вы писали:

P>Здравствуйте, DrMom


P>Я насабачился во всяких пересылках данных через COM. Это действительно удобно. Клиент спокойно жует объекты Сервера, так как если бы они были внутренними. Возни с комом правда меньше.


Для работы с объектами и пересылки сложных данных, темболее по сети ком конечно же очень удобен, но в данном случае надо передать разово данные и притом локально. Передача через глобальную переменную (глобальную в смысле на машине) будет намного быстрее и проще. Ну да впрочем кому что нравится.
Re[2]: Обмен данными между .exe и .dll
От: shvank  
Дата: 18.01.03 16:47
Оценка:
Я понимаю, что мне могут ответить RTFM, но все же
Я с с++ оч слабо знаком, поэтому можно маленький кусочек кода прислать, как глобальную для всех процессов, грузящих эту длл переменную описать?
Или, хотя бы ключевые слова для поиска
Спасибо.
Re[6]: Обмен данными между .exe и .dll
От: DrMom  
Дата: 18.01.03 16:52
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, DrMom, Вы писали:


DM>>>>А не слишком ли это экстремально для такой мелочи COM объект писать?


P>>>Нет не экстремально. Размер dll слабо зависит от COM-а, зато головной боли меньше.


DM>>Да я не про размер, а про геморой написания COM объекта. Ведь можно просто обявить глобальную структуру и в нее писать при помощи memcpy из разных процессов. Так можно сделать минут за 5, а вот с COM так не получится.


ME>Не забываем про выравнивание. Как ты узнаешь какой нужен alignment данной структуре? Можно, конечно, пытаться всегда скопировать по адресу, гарантированно обеспечивающему корректность любого alignment (как, например, при использовании file mapping (он всегда проецируется с адреса, кратного гранулярности на данной платформе)), но, IMHO, это моветон .


На мой взгляд так проще и никаких тебе выравниваний и т.п.

#pragma data_seg( ["section-name"[, "section-class"] ] )

Вот так объявляем общие переменные и ими пользуемся.
Re[3]: Обмен данными между .exe и .dll
От: DrMom  
Дата: 18.01.03 16:55
Оценка:
Здравствуйте, shvank, Вы писали:

S>Я понимаю, что мне могут ответить RTFM, но все же

S>Я с с++ оч слабо знаком, поэтому можно маленький кусочек кода прислать, как глобальную для всех процессов, грузящих эту длл переменную описать?
S>Или, хотя бы ключевые слова для поиска
S>Спасибо.


#pragma data_seg(".SEG")int data[1024];
#pragma data_seg()

Это в Длл включаешь и все. После этого из разных процессов загрузивших эту длл читаешь и пишешь в этот массив данные.
Re[3]: Обмен данными между .exe и .dll
От: DrMom  
Дата: 18.01.03 16:57
Оценка:
Здравствуйте, shvank, Вы писали:

S>Я понимаю, что мне могут ответить RTFM, но все же

S>Я с с++ оч слабо знаком, поэтому можно маленький кусочек кода прислать, как глобальную для всех процессов, грузящих эту длл переменную описать?
S>Или, хотя бы ключевые слова для поиска
S>Спасибо.

здесь
Автор: Владислав
Дата: 31.01.02
Re[7]: Обмен данными между .exe и .dll
От: shvank  
Дата: 18.01.03 17:04
Оценка:
DM>#pragma data_seg( ["section-name"[, "section-class"] ] )

Я так понял, что section-name — имя моего объекта, section-class — его тип?
Или это имеет какое-то отношение к "разделяемым секциям" в dll?
Re[8]: Обмен данными между .exe и .dll
От: shvank  
Дата: 18.01.03 17:05
Оценка:
Все, понял, спасибо большое...
Re[7]: Обмен данными между .exe и .dll
От: MaximE Великобритания  
Дата: 18.01.03 17:18
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>На мой взгляд так проще и никаких тебе выравниваний и т.п.


DM>
DM>#pragma data_seg( ["section-name"[, "section-class"] ] ) 
DM>

DM>Вот так объявляем общие переменные и ими пользуемся.

Да, для домашнего использования может и так сойдет. Но, если по-серьезному, придется вводить дополнитель уровень косвенности, чтобы клиенты не лезли в эту область напрямую и можно было бы добавить сервисы как, например, синхронизацию.
Re[2]: Обмен данными между .exe и .dll
От: Valerio Россия linkedin.com/in/boronin
Дата: 19.01.03 06:58
Оценка:
ну и не забываем о таком ограничении этого метода, как обязательное использование одной и той же dll всеми заинтересованными участниками процесса!

т.е. если 2 процесса в разных фолдерах имеют эту dll в виде 2х разных файлов, то в памяти будет 2 разных "общих" секции...
... << RSDN@Home 1.0 beta 4 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re: Обмен данными между .exe и .dll
От: adontz Грузия http://adontz.wordpress.com/
Дата: 19.01.03 08:20
Оценка:
Здравствуйте, shvank, Вы писали:

named pipes ?
memory mapped files ?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Обмен данными между .exe и .dll
От: Hacker_Delphi Россия  
Дата: 19.01.03 19:53
Оценка:
Здравствуйте, adontz, Вы писали:
A>named pipes ?
Ну оно же тока на серверах ... так же никакой переносимости/совместимости... на текущий момент всего две операционки и порядка 4/5 их комплектаций
A>memory mapped files ?
Ария — Обман
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Обмен данными между .exe и .dll
От: adontz Грузия http://adontz.wordpress.com/
Дата: 19.01.03 20:02
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, adontz, Вы писали:

A>>named pipes ?
H_D>Ну оно же тока на серверах ... так же никакой переносимости/совместимости... на текущий момент всего две операционки и порядка 4/5 их комплектаций


CallNamedPipe
The CallNamedPipe function connects to a message-type pipe (and waits if an instance of the pipe is not available), writes to and reads from the pipe, and then closes the pipe.

BOOL CallNamedPipe(
LPCTSTR lpNamedPipeName, // pipe name
LPVOID lpInBuffer, // write buffer
DWORD nInBufferSize, // size of write buffer
LPVOID lpOutBuffer, // read buffer
DWORD nOutBufferSize, // size of read buffer
LPDWORD lpBytesRead, // number of bytes read
DWORD nTimeOut // time-out value
);

Requirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.



A>>memory mapped files ?

H_D>
А чё я пользовал однажды...
A journey of a thousand miles must begin with a single step © Lau Tsu
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.