Помогите разобраться с DDE
От: DanilinS  
Дата: 16.12.05 09:47
Оценка:
Пытался разобраться с импортом данных через DDE. Есть сервер DDE, который посылает данные. Но мои попытки эти данные получить данные через DDE API к успеху не привели.
Подскажите ...
(Delphi 7, XP sp2)


Программа:
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. Подскажите, где ошибочка ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.