Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.012 c
2-1140677668
Новочеркасский Волк
2006-02-23 09:54
2006.03.19
Отправка почты. Через NMSMTP.


15-1141096201
SkyRanger
2006-02-28 06:10
2006.03.19
Рекламма


4-1135703481
oleggar
2005-12-27 20:11
2006.03.19
PID of process


2-1141566700
ctudent
2006-03-05 16:51
2006.03.19
Помогите разобраться с ошибкой!


2-1141328178
Golik
2006-03-02 22:36
2006.03.19
Как определить число записей в таблице ? поможите!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский