Написал простейший dde сервер для тестирования, однако его callback-функция не вызывается из других процессов при попытках обращения к нему (при обращениях из текущего процесса вызов происходит). Обращение к серверу делал как из exel, так и из другой тестовой программы. Из excel, посредством формулы =srv|tmp!tmp (имя топика и item сделал произвольными, т.к. просто хотел проверить наличие самого вызова). Пробовал менять кодовый страницы: CP_WINANSI и CP_WINUNICODE — не помогло. Из другой программы вызывал DDEConnect(). Текст сервера:
#include <Windows.h>
#include <conio.h>
#include <stdio.h>
#include "stdafx.h"
HDDEDATA CALLBACK dde_callback( UINT uType,
UINT uFmt,
HCONV hconv,
HDDEDATA hsz1,
HDDEDATA hsz2,
HDDEDATA hdata,
HDDEDATA dwData1,
HDDEDATA dwData2
)
{
DWORD ret=NULL;
printf("callback complete\n");
switch(uType)
{
case XTYP_CONNECT:
printf("connect\n");
ret=TRUE;
break;
case XTYP_POKE:
printf("poke\n");
break;
case XTYP_CONNECT_CONFIRM:
printf("confirm\n");
break;
case XTYP_DISCONNECT:
printf("disconnect\n");
break;
case XTYP_UNREGISTER:
printf("unregister\n");
break;
}
return (HDDEDATA) ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dde_inst=0;
DdeInitialize(&dde_inst,(PFNCALLBACK)dde_callback,APPCLASS_STANDARD,0);
WCHAR*service_name=L"srv";
HSZ hService_name=DdeCreateStringHandle(dde_inst,service_name,CP_WINUNICODE);
DdeNameService(dde_inst,hService_name,0L,DNS_REGISTER);
DdeNameService(dde_inst,hService_name,0L,DNS_FILTEROFF);
getch();
DdeFreeStringHandle(dde_inst,hService_name);
DdeNameService(dde_inst,hService_name,0L,DNS_UNREGISTER);
DdeUninitialize(dde_inst);
return 0;
}
13.05.10 02:05: Перенесено модератором из 'Прочее' — Кодт