お金にまつわる日常のブログ

妻と息子を持つ40代後半の一般的なサラリーマンのお金にまつわる日常の記録です。
日々の家計管理から、不動産や株式・FXなどの投資について綴っていきます。

MT4のShellExecuteWエラー

今回は少しプログラミングの専門的な話なので、読み飛ばして頂いて結構です。


ABLENETのVPS(Windows2008R2)で、MT4のEAを動かしたら以下のエラーとなりました。


 Cannot call 'shell32.dll::ShellExecuteW', 'shell32.dll' is not loaded MT4


Googleで検索すると同様のエラーが出ている人がいましたが、私と同じ解決策はなかったので、私の解決策を備忘録として書いておきます。


ShellExecuteWはWindowsのAPIで、エクスプローラーからファイルをダブルクリックしたときと同じような動作をします。EAから呼び出す場合には、以下のように#import 文でAPIのあるDLL(shell32.dll)を指定して、パラメータなどの型を定義します。これは決まり文句なので、これ通りに書く必要があります。


#import "shell32.dll"
int ShellExecuteA(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
int ShellExecuteW(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
#import


実際に呼び出すときは、以下のようにパラメータを渡します。以前のMT4はShellExecuteAを使いましたが、現在のMT4はUnicodeが採用されているためShellExecuteWを使う必要があります。


ShellExecuteW(NULL, "open","Plot_by_date.plt", NULL, NULL, 10);


私は取引結果をグラフ表示するためにGnuplotのスクリプトファイル(.pltファイル)を呼び出しています。これがWindows10では問題なく動いていたのですが、Windows2008R2では冒頭のエラーとなりました。


解決策は単純でした。#import 文で定義しているShellExecuteWはint型なのに、呼び出し時に戻り値を利用していなかったのでvoid型と判断されたようです。オブジェクト指向型の言語では同じ関数名でも戻り値の型が違うものは、違うものと判断されます。


int iRet;
iRet = ShellExecuteW(NULL, "open","Plot_by_date.plt", NULL, NULL, 10);


上記のようにint型に戻り値を入れるように修正したら、エラーなく動くようになりました。このようにOSが変わると、細かな(とくにエラー時の)動作が変わるので注意が必要です。


×

非ログインユーザーとして返信する

あと 2000文字

※は必須項目です。