Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с DDE Найти похожие ветки
← →
DSA (2005-12-15 11:06) [0]Пытался разобраться с импортом данных через DDE. Есть сервер DDE, который посылает данные. Но мои попытки эти данные получить данные через DDE API к успеху не привели.
Подскажите ...
Программа:
TDDEClass = class( TObject )
private
Inst: Longint;
ServiceHSz: HSz;
TopicHSz: HSz;
ItemHSz: HSz;
ConvHdl: HConv;
CallBackPtr: TFNCallback;
protected
public
constructor Create;
destructor Destroy; override;
procedure Request(HConversation: HConv);
end;
TDataString = array[0..20] of Char;
implementation
uses Unit1;
{ TDDEClass }
procedure TDDEClass.Request(HConversation: HConv);
var
hDdeTemp: HDDEData;
DataStr: TDataString;
Err, I: Integer;
begin
if HConversation <> 0 then
begin
...
end; { if }
end;
function CallbackProc(CallType, Fmt: Word; Conv: HConv; hsz1, hsz2: HSZ;
Data: HDDEData; Data1, Data2: Longint): HDDEData; export;
begin
CallbackProc := 0;
case CallType of
xtyp_Register:
begin
{ 0 }
end;
xtyp_Unregister:
begin
{ 0 }
end;
xtyp_xAct_Complete:
begin
{ 0 }
end;
xtyp_Request, Xtyp_AdvData:
begin
DDEClass.Request(Conv);
CallbackProc := dde_FAck;
end;
xtyp_Disconnect:
begin
ShowMessage(" соединение разорвано ");
// Form1.Close;
end;
end;
end;
constructor TDDEClass.Create;
begin
Inst := 0;
ConvHdl := 0;
ServiceHSz := 0;
TopicHSz := 0;
ItemHSz := 0;
CallBackPtr := MakeProcInstance(@CallBackProc, HInstance);
if DdeInitialize(Inst, CallBackPtr, AppCmd_ClientOnly,
0) = dmlErr_No_Error then
begin
ServiceHSz := DdeCreateStringHandle(Inst, "DD2000", cp_WinAnsi);
TopicHSz := DdeCreateStringHandle(Inst, "EURUSD", cp_WinAnsi);
ItemHSz:= DdeCreateStringHandle(Inst, "ASK", cp_WinAnsi);
end
else
begin
ShowMessage("Не прошла инициализация !");
// Close;
end;
if (ServiceHSz <> 0) and (TopicHSz <> 0) then
begin
ConvHdl := DdeConnect(Inst, ServiceHSz, TopicHSz, nil);
if ConvHdl = 0 then
begin
ShowMessage(" Не могу иниц. диалог! (DdeConnect) ");
// Close;
end
end
else
begin
ShowMessage("Не могу создать строки!");
// Close;
end;
if DdeClientTransaction(nil, 0, ConvHdl, ItemHSz, cf_Text, xtyp_AdvStart, 1000, nil) = 0 then
ShowMessage("Не могу выполнить запуск потока");
end;
destructor TDDEClass.Destroy;
begin
if DdeClientTransaction(nil, 0, ConvHdl, ItemHSz, cf_Text, xtyp_AdvStop, 1000, nil)= 0 then
ShowMessage("Не могу остановить поток");
if not(DdeDisconnect(ConvHdl)) then ShowMessage("Не могу закрыть канал!");
if ServiceHSz <> 0 then
DdeFreeStringHandle(Inst, ServiceHSz);
if TopicHSz <> 0 then
DdeFreeStringHandle(Inst, TopicHSz);
if ItemHSz <> 0 then
DdeFreeStringHandle(Inst, ItemHSz);
if Inst <> 0 then
DdeUninitialize(Inst);
inherited;
end;
примерно так ... ( листинг немного отредактирован для уменьшения обьема ).
Симптомы: все операции проходят нормально, на в CallbackProc данные не поступают. Эпизодически проходят вызовы CallbackProc с CallbackProc = 1. Подскажите, где ошибочка ...
← →
umbra © (2005-12-15 11:54) [1]а если в
DdeInitialize
передать просто@CallBackProc
?
← →
DSA (2005-12-15 12:16) [2]Пройденный этап. Ничего не менялось. Если Топик и Итемс не верны - CallBackProc не вызываеться совсем. Если верны - вызовы с CallbackProc = 1 ... Могу предположить, что они возникают в момент изменения данных сервера ( не факт ). Но это не данные ...
Всю голову сломал ... ( Может есть у кого описание WinAPI функций DDE на русском? )
← →
DSA (2005-12-19 09:36) [3]Разобрался.
Проблемма крылась в описании function CallbackProc( ... ): HDDEData; export;
Просто я скопировал чужой пример из инета "один в один".
Я заменил "export" на "stdcall" и всё заработало. ( Интересно, а у того кто выкладовал работало? )
← →
имя (2005-12-26 10:13) [4]Удалено модератором
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c