|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 7:17 am
|
Страница 1 от 1
|
[ 6 мнения ] |
|
Още един Проблем с VC++ програмиране
| Автор |
Съобщение |
|
diofan
Ранг: Минаващ
Регистриран на: Чет Сеп 29, 2005 10:28 am Мнения: 21
|
 Още един Проблем с VC++ програмиране
Кода който пиша(VC++6.0) се компилира до dll и върви в някакво ехе в отделна нишка.
От този dll управлявам друга програма която работи като СОМ сървър.
Тъй като трябва да прихващам разни ивенти в този сървър, правя връзка от сървъра към клиента(моя длл) чрез някакъв КънекшънПоинт интерфейс и при даден ивент сървъра вика функция от моя код.
Проблема е че сървъра има достъп до моята функция само докато съм отворил диалог или месаге бокс от длл-a, ако сложа пауза вместо да отварям месаге бокс - например Sleep(..) - няма ефект ,т.е. сървъра не получава достъп. Ще бъда благодарен за някакви насоки как да избегна отварянето на прозорец, за да прихвана ивента.
|
| Сря Яну 30, 2008 6:08 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
с твоята функция отвори HIDEN hWND .... return ClientHandle
server SendMessage(hClient.......) и обратно client SendMessage(hServer.......) с месаге
WM_XXXXXX := RegisterWindowMessage(PChar('MessageXXXXXX'));
можеш да полаваш и CreateMappedFile за да шарнеш ресурси между приложенията....
_________________ main[-1u]={1};
|
| Сря Яну 30, 2008 6:47 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Не съм фен на съобщенията през джамовете, има едно много сериозно забавяне, в зависимост какво върши прозореца и колко други съобщения трябва да обработи в момента в който пращам съобщение.
С CreateMapFile (shared memory segment) правя повечето неща, но там има други проблеми - синхронизиране на двата (и повече) процеса, които ще работят в тоя сегмент. Друг проблем, който срещам там (и нямам време да ровя как да го отстраня), как комуникацията да работи между процеси, стартирани с различен logon. @TheWizard, ако имаш някаква идея моля те сподели я
@diofan, виж тук за пример с Shared Memory Segment
|
| Чет Яну 31, 2008 3:45 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
различен logon.... не съм пробвал такива ситуации
_________________ main[-1u]={1};
|
| Чет Яну 31, 2008 10:45 pm |
|
 |
|
diofan
Ранг: Минаващ
Регистриран на: Чет Сеп 29, 2005 10:28 am Мнения: 21
|
Благодаря за насоките които ми дадохте, но тъй като нямам голям опит с програмирането на ВС++, бих искал да знам дали съм разбрал правилно идеята как да ползвам CreateFileMapping - трябва да направя отделна програма, която приема ивенти и ги отразява в този мапинг, откъдето ги чете моето приложение?
|
| Пет Фев 01, 2008 7:23 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Не ти трябва отделна програма, мапваш си променлива (структура, масив или нещо което искаш да пренесеш от един процес в друг) във PageFile-a на Windows, който ползваш като Shared Memory Segment (споделена памет) между процеси, нишки и пр. Удобството е, че можеш да отвориш този "мап" от други процеси.
 |  |  |  | Код: int* mydata;
// мапваш pointer-a mydata в PageFile-a на Windows HANDLE host_handle = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(integer),"MySharedMemorySegment"); mydata = (int*)MapViewOfFile(host_handle,FILE_MAP_WRITE,0,0,0);
// оттук насетне, като пишеш в mydata, резултата се записва във PageFile-a на Windows mydata = 101;
// в другия процес (може и в същия)
int* client_data;
// map-ваш client_data в PageFile-a, на същото място където си мапнал в другия процес HANDLE client_handle = OpenFileMapping(FILE_MAP_READ,false,"MySharedMemorySegment"); client_data = (int*)MapViewOfFile(client_handle,FILE_MAP_READ,0,0,0);
// оттук всяко четене на client_data прочита PageFile-а и получаваш това което си записал в другия процес printf("client_data=%d", client_data);
|  |  |  |  |
Прочети малко MSDN за CreateFileMapping и OpenFileMapping. Ако разровиш нета, ще намериш и готови класове със синхронизации и пр. Има много варианти да се напише това, можеш да отвориш например сегмент с достъп FILE_MAP_ALL_ACCESS и в двата процеса, така че да четеш/пишеш и от двата процеса в един и същи map.
|
| Пет Фев 01, 2008 8:05 pm |
|
|
|
Страница 1 от 1
|
[ 6 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|