[筆記] 關於 AutoIt 實現 DDE 功能

由於諸多即時看盤軟體本身亦即為 DDE Server,可以讓支援 DDE 協定,例如 Excel 就可以成為 元大 Yeswin(支援 DDE)的 Client,可以即時擷取大盤等相關數據。 擷取 DDE 的格式為: DDEServer|Topic!Item 。 該 DDE 字串會由證券商所提供的看盤軟體相關的 Help 文件可查詢到。 例如,欲觀察 元大Yeswin 的大盤資訊—上市上漲家數, 則在 Excel 的某一欄位(Cell) 填入 YES|DQ!&TWTK2.Name

但是若每此看盤都需要打開 Excel,實在甚為不便,所擷取的數據不一定非得要透過 Excel 來處理,也有可能交給 Wealth-Lab 來分析。 所以可以利用其它亦有支援 DDE 實作的語言機制,如 VB6 是最簡單的了,來實現一個 DDE 中介的常駐程式,可以將擷取得來的數據再轉給其它的應用程式(如 Wealth-Lab)來處理; 甚至,也可以實作一個可以連結多個資料來源的 DDE Server,以確保資料的容錯性。

由於撰寫 VB6 還要準備開發環境,實在甚為不便,所以轉而尋求透過簡單但強大的自動化巨集處理的應用工具,AutoIt
AutoIt 的程式語法為 VB Script-based, 它內建支援了諸多關於如 GUI 與 字串處理等函數(Function)。 但截至目前版本(v3.2.12.1, 2008/06/12))為止, 尚未提供連結 DDE(Dynamic Data Exchange) 的函數。

但是,AutoIt 其實可以透過 VBScript 語法,直接呼叫外部 Windows 的 API 與 DLL 程式。 而其中,微軟為其 DDE 所提供的應用程式介面,稱之為 DDEML (Dynamic Data Exchange Management Library),以簡化連結 DDE 的實作。

再則,AutoIt Forum 才人備出,已有國外網友撰寫了 DDE 的函數群,其實這些函數就是一種 包裹(Wrapper) 的應用,以避免 AutoIt 的 Script 開發者,還需要涉及到實際呼叫 DDEML (包括指定路徑與DLL檔名) 的連結細節。

從上述討論串可以下載該網友所提供的 DDE 函數庫以及範例,將函數庫可以解縮至 AutoIt 的 /Include 子目錄內。但是,所提供的範例並沒有說明清楚,甚至執行還會出錯。 不過,關於 DDEML 的主體部分,則確定是完成沒有問題。

關於如何實現 DDE Client 連結 DDE Server(元大Yeswin),不得已還是必須具備 DDE 的相關知識方可,但 DDE 應該算是一個蠻早期,也比較落後的一種連結技術,可以參考的文件似乎不太多了。 最重要的文件參考來源: MSDN DDEML Overview,可以說是必要研讀的線上文件。

目前是暫時寫了一段小程式,以測試是否可以透過 AutoIt 連結 元大Yeswin 的 DDE Server。測試性的程式碼如下:


#include <DDEML.au3>
#include <DDEMLClient.au3>

Global $hConvSrv = 0

_DdeInitialize("", BitOR($APPCMD_CLIENTONLY, $CBF_SKIP_ALLNOTIFICATIONS))

ExecDDECmd()

Func ExecDDECmd()
    Local $hszService = 0
    Local $hszTopic = 0
    If 0 = $hConvSrv Then
        $hszService = _DdeCreateStringHandle("YES")
        $hszTopic = _DdeCreateStringHandle("DQ")
        $hConvSrv = _DdeConnect($hszService, $hszTopic)
    EndIf
    If 0 = $hConvSrv Then
        MsgBox(0, "DDE Client", "無法連結 DDE 伺服器")
	Else
		$sz = "&TWTK2.Price"
		$str_handle = _DdeCreateStringHandle($sz)
		$Data = _DdeClientTransaction($XTYP_REQUEST, $hConvSrv, 0, 10000, $str_handle, $CF_TEXT)
		$res = _DdeGetDataAsString($Data)
		MsgBox(0, "String Handle is: ", $res)
		_DdeDisconnect($hConvSrv)
	EndIf

    If 0 <> $hszService Then _DdeFreeStringHandle($hszService)
    If 0 <> $hszTopic Then _DdeFreeStringHandle($hszTopic)
EndFunc

連結 DDE Server 相當地簡單,但是要下字串(Item)取得相對應的數據,不知道是否是因為晚上 Yeswin 沒有提供即時數據的關係,有些 Item 可以取得數據,而有些又不行...。 還有比較重要的一個問題是,我對 DDE 在建立 conversation 後,Client 與 Server 的交易處理(transaction management)問題,我還是陌生不熟悉,這仍有待再研讀 MSDN 上的文件。

待上述問題解決後,我應該會再把更完成的原始程式碼公布出來,最起碼要展現一下我目前最想要的,可以即時顯示「漲家跌家趨勢圖」。 🙂

文章導覽

   

共有 14 則迴響

  1. 你好!最近因為老闆希望我幫公司大廳的螢幕設定自動播放宣傳檔案.
    我用WINDOWS內建的自動執行排程不是很順利.所以想找一個軟體來呼叫一些免費播放軟體:kmplay.但又面臨它不會自動執行.點選播放程式也不會呼叫主程式.如果使用autoit可以解決這個問題嗎?大概要怎樣設定!?
    感恩!

  2. 修改DDEML.au3
    把604行的2個@ProcessorArch 修改為@OSArch
    既可正常使用DDEML.au3

    但執行的效率不是很理想
    C# 參考NDde.dll 也很容易使用DDE

  3. 大大您好,
    我對您這個題目很有興趣, 我平常多在Excel上面操作這些DDE的資訊處理, Autoit略有涉足,
    對他的功能強大及方便性很喜歡。我也測試了您所提的DDEML, 一直有錯誤, 把DDEML幾個檔案放到Include目錄
    下也沒用, 原網站也沒對錯誤的問題解答, 可否解惑一番, 該做些什麼才能正確執行。
    還有您的後續研究可有成果, 很期待能看到, 感恩!!
    我在SciTE4AutoIt3裡面執行SampleDDEServer.au3及SampleDDEClient.au3看到的錯誤訊息都是
    “C:\Program Files\AutoIt3\Include\DDEML.au3 (3) : ==> Error opening the file.:
    #include ”

    可是本來就沒有Clipboard.au3這檔案啊

      • 大大您好,
        您這篇文我已經觀察並等待數月, 等著看有何進展。您的說明及連結的討論串我也看了好幾遍,
        也下載了1.51版本來測試, 您說會執行錯誤我也碰到了。 那您附上的程式碼是想說明說這個DDEML已經有人寫了,
        但是會執行錯誤而已嗎? 還是已經放棄繼續探索了? 或是您有做了些修正而執行成功了, 請您指教, 感恩!!

        • 喔喔,我記得那位作者寫的範例其中有個我執行也是有問題的。誤解您的意思, sorry~ (如果我有執行成功,肯定會公開出來的)

          關於 AutoIt, 我已經不打算用它來寫關於 DDE 連結相關的應用了,而是改用如 C#.NET 撰寫,(若會 VB6,用這個會更方便)。 使用 c# 撰寫如何連結 DDE 的程式碼,我已在另文說明並在「聚財網」提供程式碼下載。

          為何不再使用 AutoIt? 也就是這個作者寫的 DDEML Wrapper 我覺得有問題,但我也不願意去花時間深入研究它;改成使用 C# 撰寫,對我來說,反而更容易。

  4. 在hts上,似乎沒辦法不用excel做中介,改以下三行

    $hszService = _DdeCreateStringHandle(“excel”)
    $hszTopic = _DdeCreateStringHandle(“[book1.xls]sheet1”)
    ;
    ;
    $sz = “r1c1”

    即可透過excel 轉進資料,但是如果不用excel,卻怎麼樣也找不到對應的字串,
    似乎hts沒辦法不用excel做中轉站

  5. 謝謝你這篇的介紹.

    小弟目前有打算學習DDE 的方面的知識,

    然後可能希望可以弄一個 程式.

    雖然我比較熟的是java XD, java 跟DDE 交集似乎不多XD

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *