2018年10月31日 星期三

讓 MultiCharts 隨意執行外部程式

起因於上過 myCTA 課程的同學問了我個問題:「有沒有讓 MultiCharts 可以直接發 mail 的函數或是指令?」就我個人的印象:沒有。只記得可以透過 alert 去觸發凱衛報價元件的警報通知來發 mail,從 MC 直接來的應該沒有。比如我自己現在沒使用凱衛的報價服務,就無法透過這個管道。

日常維運需要的訊息通知發送,我都是仰賴下單大師本身的錯誤通報功能與自己用 AutoIT 做出來的發 mail 用的 .exe 來實現,還得配合 MacroExpress 才做到應我自己的需要去發送通知及其他應用。但在上回已經能利用 kernel32.dll 來做文字檔的讀取工作後,想到 windows API 應該也會有這方面的功能、應用吧?幾經搜尋下,線索指向了 shell32.dll,看了 shell32.dll 的 call fuction list 後,對於如何在 MultiCharts 引用,還是不得其門。



於是 google 了 "shell32 + MultiCharts",很多 MC 知識的取得,多半透過可能是解答的關鍵字加上 MultiCharts 而找到,原廠論壇的內容也就常常這樣幫助了我。這次搜尋,出現 Amin 大的文章(https://dh3p7.app.goo.gl/Ff1v),其中這部分我覺得應該會是我所需要的(感謝 Amin)。




做了個指標測試一下是否如所想像?
DefineDLLFunc:"shell32.dll", Long, "ShellExecuteA", Long, lpstr, lpstr, lpstr, lpstr, Long;


if LastBarOnChart then begin
  once ShellExecuteA(0, "open", "C:\mail_TXFportfolio.exe", "1", "", 5);
end;


mail_TXFportfolio.exe 是我用來自動發文到 blogger 的程式,用 AutoIT 做的。測試結果如下:


看起來的確是能執行外部程式的。再測試一下是否能執行 bat 檔,也是可以的。我猜想,這樣的呼叫外部程式效果,也許有如在 檔案總管 找到要執行的檔案,做一下 double click 的效果?或許什麼檔案都能呼叫,不限定可執行的也不一定?看你的 windows 與被呼叫的檔案所對應的開啟程式關連而定。


目前還沒把 ShellExecuteA 的每個參數有什麼作用搞清楚。