Проблема с DdeCreateStringHandle
От: ralfeus  
Дата: 14.10.06 08:03
Оценка:
Привет всем.
Пытаюсь создать DDE сервер, но застрял в начале. Вот так выглядит инициализация:

if (DdeInitialize((LPDWORD)&idInst, (PFNCALLBACK)&DDEServerCallback, APPCLASS_STANDARD, 0))
    return FALSE;
hszService = DdeCreateStringHandle(idInst, pszService, CP_WINANSI);
hszTopic = DdeCreateStringHandle(idInst, pszTopic, CP_WINANSI);
hszItem = DdeCreateStringHandle(idInst, pszItem, CP_WINANSI);
DdeNameService(idInst, hszService, (HSZ)NULL, DNS_REGISTER);



Почему-то все DdeCreateStringHandle возвращают одинаковое значение и все три переменные равны 0x0000c000. Думал, что ошибка, но в MSDN сказано, что в случае ошибки DdeCreateStringHandle возвращает 0. Что бы могло быть?
Спасибо


16.10.06 12:30: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Проблема с DdeCreateStringHandle
От: azzx Россия  
Дата: 16.10.06 05:56
Оценка:
Здравствуйте, ralfeus, Вы писали:


R>Почему-то все DdeCreateStringHandle возвращают одинаковое значение и все три переменные равны 0x0000c000. Думал, что ошибка, но в MSDN сказано, что в случае ошибки DdeCreateStringHandle возвращает 0. Что бы могло быть?

R>Спасибо

На что указывает psaService/pszTopic/psaItem?

Если одно и то же, то всё правильно:

When an application calls DdeCreateStringHandle and specifies a string that already exists in the table, the system increments the usage count rather than adding another occurrence of the string. (An application can also increment the usage count by using DdeKeepStringHandle.) When an application calls the DdeFreeStringHandle function, the system decrements the usage count.

A string is removed from the table when its usage count equals zero. Because more than one application can obtain the handle to a particular string, an application must not free a string handle more times than it has created or retained the handle. Otherwise, the application can cause the string to be removed from the table, denying other applications access to the string.

The DDEML string-management functions are based on the atom manager and are subject to the same size restrictions as are atoms.

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Проблема с DdeCreateStringHandle
От: ralfeus  
Дата: 16.10.06 06:07
Оценка:
Здравствуйте, azzx, Вы писали:



A>На что указывает psaService/pszTopic/psaItem?


A>Если одно и то же, то всё правильно:


Нет, указывают они на разное:
pszService 0x0041bb88 "TestServer" wchar_t *
pszTopic 0x0041b954 "TestTopic" wchar_t *
pszItem 0x0041b97c "TestItem" wchar_t *
Re[3]: Проблема с DdeCreateStringHandle
От: azzx Россия  
Дата: 16.10.06 07:45
Оценка:
Здравствуйте, ralfeus, Вы писали:


A>>На что указывает psaService/pszTopic/psaItem?


A>>Если одно и то же, то всё правильно:


R>Нет, указывают они на разное:

R>pszService 0x0041bb88 "TestServer" wchar_t *
R>pszTopic 0x0041b954 "TestTopic" wchar_t *
R>pszItem 0x0041b97c "TestItem" wchar_t *

В таком случае, похоже на то, что где-то по дороге вызывается DdeFreeStringHandle().
Могу кинуть небольшую тестовую програмку поиграться — наглядно видно как изменяются хендлы строк.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Проблема с DdeCreateStringHandle
От: ralfeus  
Дата: 16.10.06 07:48
Оценка:
Здравствуйте, azzx, Вы писали:

A>В таком случае, похоже на то, что где-то по дороге вызывается DdeFreeStringHandle().

A>Могу кинуть небольшую тестовую програмку поиграться — наглядно видно как изменяются хендлы строк.

Если не трудно — кинь, пожалуйста
Re[5]: Проблема с DdeCreateStringHandle
От: azzx Россия  
Дата: 16.10.06 08:10
Оценка:
Здравствуйте, ralfeus, Вы писали:

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


A>>В таком случае, похоже на то, что где-то по дороге вызывается DdeFreeStringHandle().

A>>Могу кинуть небольшую тестовую програмку поиграться — наглядно видно как изменяются хендлы строк.

R>Если не трудно — кинь, пожалуйста


Покалал сюда: http://www.rsdn.ru/File/56451/test.zip
Используется библиотека, но, думаю, понеятно что к чему.
test1 — это "как надо". В т.ч. можно проверить и идентичность хендлов для одинаковых строк.
test2 — демонстрация возможной ошибки.

Кстати, если интересно, могу рассказать ещё про пару фокусов в DDEML.
Может сбережёт немного времени.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Проблема с DdeCreateStringHandle
От: ralfeus  
Дата: 16.10.06 08:51
Оценка:
Здравствуйте, azzx, Вы писали:

A>Покалал сюда: http://www.rsdn.ru/File/56451/test.zip

A>Используется библиотека, но, думаю, понеятно что к чему.
A>test1 — это "как надо". В т.ч. можно проверить и идентичность хендлов для одинаковых строк.
A>test2 — демонстрация возможной ошибки.

A>Кстати, если интересно, могу рассказать ещё про пару фокусов в DDEML.

A>Может сбережёт немного времени.

Насколько я понял DdeCreateStringHandle тоже создает хендл и сразу его удаляет? Что-то нигде про подобное не читал... Да и разные примеры используют DdeCreateStringHandle без дополнительных телодвижений... Или я все таки что-то пропускаю? А в твоей библиотеке как хендл создается? Именно DdeCreateStringHandle?
Re[7]: Проблема с DdeCreateStringHandle
От: ralfeus  
Дата: 16.10.06 10:54
Оценка:
R>Насколько я понял DdeCreateStringHandle тоже создает хендл и сразу его удаляет? Что-то нигде про подобное не читал... Да и разные примеры используют DdeCreateStringHandle без дополнительных телодвижений... Или я все таки что-то пропускаю? А в твоей библиотеке как хендл создается? Именно DdeCreateStringHandle?

Ага, разобрался. Оказалось нужно было в DdeCreateStringHandle указать CP_WINUNICODE вместо CP_WINANSI.

A>>Кстати, если интересно, могу рассказать ещё про пару фокусов в DDEML.

A>>Может сбережёт немного времени.

Если не трудно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.