Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Още един Проблем с VC++ програмиране
http://mcu-bg.com/mcu_site/viewtopic.php?f=16&t=5402
Страница 1 от 1

Автор:  diofan [ Сря Яну 30, 2008 6:08 pm ]
Заглавие:  Още един Проблем с VC++ програмиране

Кода който пиша(VC++6.0) се компилира до dll и върви в някакво ехе в отделна нишка.
От този dll управлявам друга програма която работи като СОМ сървър.
Тъй като трябва да прихващам разни ивенти в този сървър, правя връзка от сървъра към клиента(моя длл) чрез някакъв КънекшънПоинт интерфейс и при даден ивент сървъра вика функция от моя код.
Проблема е че сървъра има достъп до моята функция само докато съм отворил диалог или месаге бокс от длл-a, ако сложа пауза вместо да отварям месаге бокс - например Sleep(..) - няма ефект ,т.е. сървъра не получава достъп. Ще бъда благодарен за някакви насоки как да избегна отварянето на прозорец, за да прихвана ивента.

Автор:  TheWizard [ Сря Яну 30, 2008 6:47 pm ]
Заглавие: 

с твоята функция отвори HIDEN hWND .... return ClientHandle
server SendMessage(hClient.......) и обратно client SendMessage(hServer.......) с месаге
WM_XXXXXX := RegisterWindowMessage(PChar('MessageXXXXXX'));

можеш да полаваш и CreateMappedFile за да шарнеш ресурси между приложенията....

Автор:  Predator_MF [ Чет Яну 31, 2008 3:45 pm ]
Заглавие: 

Не съм фен на съобщенията през джамовете, има едно много сериозно забавяне, в зависимост какво върши прозореца и колко други съобщения трябва да обработи в момента в който пращам съобщение.

С CreateMapFile (shared memory segment) правя повечето неща, но там има други проблеми - синхронизиране на двата (и повече) процеса, които ще работят в тоя сегмент. Друг проблем, който срещам там (и нямам време да ровя как да го отстраня), как комуникацията да работи между процеси, стартирани с различен logon. @TheWizard, ако имаш някаква идея моля те сподели я :)

@diofan, виж тук за пример с Shared Memory Segment

Автор:  TheWizard [ Чет Яну 31, 2008 10:45 pm ]
Заглавие: 

различен logon.... не съм пробвал такива ситуации

Автор:  diofan [ Пет Фев 01, 2008 7:23 pm ]
Заглавие: 

Благодаря за насоките които ми дадохте, но тъй като нямам голям опит с програмирането на ВС++, бих искал да знам дали съм разбрал правилно идеята как да ползвам CreateFileMapping - трябва да направя отделна програма, която приема ивенти и ги отразява в този мапинг, откъдето ги чете моето приложение?

Автор:  Predator_MF [ Пет Фев 01, 2008 8:05 pm ]
Заглавие: 

diofan написа:
Благодаря за насоките които ми дадохте, но тъй като нямам голям опит с програмирането на ВС++, бих искал да знам дали съм разбрал правилно идеята как да ползвам CreateFileMapping - трябва да направя отделна програма, която приема ивенти и ги отразява в този мапинг, откъдето ги чете моето приложение?


Не ти трябва отделна програма, мапваш си променлива (структура, масив или нещо което искаш да пренесеш от един процес в друг) във 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.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/