Главная страница
    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.014 c
2-1141052609
anonymous-
2006-02-27 18:03
2006.03.19
Минимальный размер splitter


2-1141105829
Mike48
2006-02-28 08:50
2006.03.19
Нужна программа распаковщик файлов с дискеты


5-1127730027
DimaBr
2005-09-26 14:20
2006.03.19
Пункт меню редактора компонента 2


2-1140411056
TStas
2006-02-20 07:50
2006.03.19
Как от личить файл от папки при FindFirst


2-1141447935
Trych
2006-03-04 07:52
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский