Отговори на тема  [ 6 мнения ] 
Още един Проблем с VC++ програмиране 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

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


Сря Яну 30, 2008 6:08 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Не съм фен на съобщенията през джамовете, има едно много сериозно забавяне, в зависимост какво върши прозореца и колко други съобщения трябва да обработи в момента в който пращам съобщение.

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

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


Чет Яну 31, 2008 3:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
различен logon.... не съм пробвал такива ситуации

_________________
main[-1u]={1};


Чет Яну 31, 2008 10:45 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Сеп 29, 2005 10:28 am
Мнения: 21
Мнение 
Благодаря за насоките които ми дадохте, но тъй като нямам голям опит с програмирането на ВС++, бих искал да знам дали съм разбрал правилно идеята как да ползвам CreateFileMapping - трябва да направя отделна програма, която приема ивенти и ги отразява в този мапинг, откъдето ги чете моето приложение?


Пет Фев 01, 2008 7:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
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.


Пет Фев 01, 2008 8:05 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни