由於諸多即時看盤軟體本身亦即為 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 上的文件。
待上述問題解決後,我應該會再把更完成的原始程式碼公布出來,最起碼要展現一下我目前最想要的,可以即時顯示「漲家跌家趨勢圖」。 🙂
你好!最近因為老闆希望我幫公司大廳的螢幕設定自動播放宣傳檔案.
我用WINDOWS內建的自動執行排程不是很順利.所以想找一個軟體來呼叫一些免費播放軟體:kmplay.但又面臨它不會自動執行.點選播放程式也不會呼叫主程式.如果使用autoit可以解決這個問題嗎?大概要怎樣設定!?
感恩!
Hi, 請查 Google!
修改DDEML.au3
把604行的2個@ProcessorArch 修改為@OSArch
既可正常使用DDEML.au3
但執行的效率不是很理想
C# 參考NDde.dll 也很容易使用DDE
難得 malis 能找出 DDEML.au3 的 bug,感謝 ^^
大大您好,
我對您這個題目很有興趣, 我平常多在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這檔案啊
Hi, 我在文章內頭已有提及,討論區的國外網友 (且含鍊結)有人寫了 AutoIt for DDEML 的 Wrapper。
大大您好,
您這篇文我已經觀察並等待數月, 等著看有何進展。您的說明及連結的討論串我也看了好幾遍,
也下載了1.51版本來測試, 您說會執行錯誤我也碰到了。 那您附上的程式碼是想說明說這個DDEML已經有人寫了,
但是會執行錯誤而已嗎? 還是已經放棄繼續探索了? 或是您有做了些修正而執行成功了, 請您指教, 感恩!!
喔喔,我記得那位作者寫的範例其中有個我執行也是有問題的。誤解您的意思, sorry~ (如果我有執行成功,肯定會公開出來的)
關於 AutoIt, 我已經不打算用它來寫關於 DDE 連結相關的應用了,而是改用如 C#.NET 撰寫,(若會 VB6,用這個會更方便)。 使用 c# 撰寫如何連結 DDE 的程式碼,我已在另文說明並在「聚財網」提供程式碼下載。
為何不再使用 AutoIt? 也就是這個作者寫的 DDEML Wrapper 我覺得有問題,但我也不願意去花時間深入研究它;改成使用 C# 撰寫,對我來說,反而更容易。
Hello speculatorhuang:
HTS 好像很開放,但又有許多地方挺封閉的。
不過,HTS 有必要一定要開啟 Excel ? 待我再試試看囉。
在hts上,似乎沒辦法不用excel做中介,改以下三行
$hszService = _DdeCreateStringHandle(“excel”)
$hszTopic = _DdeCreateStringHandle(“[book1.xls]sheet1”)
;
;
$sz = “r1c1”
即可透過excel 轉進資料,但是如果不用excel,卻怎麼樣也找不到對應的字串,
似乎hts沒辦法不用excel做中轉站
Hi Kane Yen:
似乎與 .NET or Java 熟不熟也沒差 ^^
反正網路上有的是如何連結的資料。 🙂
謝謝你這篇的介紹.
小弟目前有打算學習DDE 的方面的知識,
然後可能希望可以弄一個 程式.
雖然我比較熟的是java XD, java 跟DDE 交集似乎不多XD
Hi Liusonfire:
其實這只是我的筆記備忘錄而已啦。 !^^
萬分感謝
很棒的文及程式
期待你新的解說與大作