Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

Помогите разобраться с 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 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.033 c
1-1139933625
Robert
2006-02-14 19:13
2006.03.19
Richedit добавить текст в гиперссылку


3-1138282885
Stanislav
2006-01-26 16:41
2006.03.19
Передать серверу Application Name


2-1141189028
Anton :-))
2006-03-01 07:57
2006.03.19
как определить по какому из объектов был нанесен удар мышью?


4-1134633968
DSA
2005-12-15 11:06
2006.03.19
Помогите разобраться с DDE


11-1121750231
hunn
2005-07-19 09:17
2006.03.19
Работа с событиями в KOLEcmListEdit