Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > DDE название топика эксель


Автор: Andrej78 28.3.2011, 16:46
Доброго времени суток.

пытаюсь сделать dde сервер (сторонняя прога выдает данные в формате эксель [XlTable] по дде и мне их нужно принять).

vc++2005  + winapi + стандартная библиотека ddeml

Cначала создаю переменные с названием сервера, топика и итема.
Код

   g_hszAppName = DdeCreateStringHandle(g_idInst, L"DdemlSvr", NULL);
   g_hszTopicName = DdeCreateStringHandle(g_idInst, L"[TRD]TRD",NULL);//MyTopic
   g_hszItemName = DdeCreateStringHandle(g_idInst, L"R1C1", NULL);//MyItem


потом, когда получаю сообщение от источника через ddeml  XTYP_CONNECT, смотрю, этому ли серверу сообщение и тот ли топик (тема)

Код

// Our DDE Callback function...
HDDEDATA EXPENTRY DdeCallback(UINT wType, UINT fmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2) {
int topicn,appnam;
   switch (wType) {
      
   // ----------------------------------------------------------------
   case XTYP_CONNECT:
      // Client is trying to connect. Respond TRUE if we have what they want...
       topicn=DdeCmpStringHandles(hsz1, g_hszTopicName);    //здесь несовпадение
       appnam= DdeCmpStringHandles(hsz2, g_hszAppName);
       
       //MessageBox(NULL, (LPCWSTR)hsz1*, L"Error", MB_SETFOREGROUND);
       if ((!DdeCmpStringHandles(hsz1, g_hszTopicName)) &&
         (!DdeCmpStringHandles(hsz2, g_hszAppName))) return (HDDEDATA)TRUE;   // SERVER supports Topic|Service
      else return FALSE;  // SERVER does not support Topic|Service
...


Суть проблемы в том, что в исходной программе - клиенте ввожу имя сервера, рабочую книгу и лист, которые потом становятся строкой и ddeml ставит на эту строку идентификатор.
Чтобы получить со своей стороны такой же идентификатор (и сказать, что посылаемая тема==запрашиваемой), я должен предоставить такую же строку.

Вот как бы подсмотреть, что именно содержится в топике с идентификатором hsz1, присылаемом источником (клиентом)?

Он не совпадает с введенным:
Код

       topicn=DdeCmpStringHandles(hsz1, g_hszTopicName);    //здесь несовпадение, выдает 1. 1 в справке по ф-ии - if the value of Hsz2(здесь g_hszTopicName) is either 0 or less than the value of Hsz1. 


(топиков желательно получать несколько, поэтому просто проигнорировать несовпадение топика не получится).

Предположительно, правильное название топика в этом случае [TRD]TRD                    [Рабочая книга]Лист

Подскажите плз, можно как-то глянуть, что скрывается за hsz1?

Автор: Andrej78 29.3.2011, 10:05
Вопрос снимаю.

Ответили:

Название топика в коллбэке можно узнать:
Код

int iCount = DdeQueryString(idInstr, hsz1, null, 0, CP_WINANSI);
byte[] bf = new byte[iCount+1];
DdeQueryString(idInstr, hsz1, bf, iCount, CP_WINANSI);
string s = System.Text.Encoding.ASCII.GetString(bf);


if (uType == XTYP_CONNECT_CONFIRM) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)