Hallo Thomas,
falls Dir 'mal wieder jemand mit dem MetaTrader4 kommt, dann habe ich hier die Lösung zur Anbindung von MetaTrader4 (Version 4.00 Build 509 vom 24. Juni 2013) an Membrain:
Offenbar darf man im MetaTrader4 also nicht die MembrainDLL.dll-Funktionsnamen verwenden, sondern die Aliasse, wie sie in Deinem DLL-Beispiel
namens "VBA DLL-Beispiel" ersichtlich sind. Dieses "VBA DLL-Beispiel" ist im Download-Bereich des Membrain User-Forums downloadbar.
Da ich den Zugang vom MetaTrader4 auf die MembrainDLL.dll doch nicht alleine hinbekommen habe, habe ich im MetaTrader-Forum
einen DLL-Experten darum gebeten sich die Sache 'mal anzuschauen und er hat erfreulicherweise die Lösung gefunden (Man bin ich erleichtert!).
Er schreibt mir folgendes zurück und hat wohl völlig recht mit seinen geäußerten Vermutungen:
The issue is that the function names exported by MembrainDll.dll are not what you think they are. For example, the correct exported function name is __MB_GetVersionInfo@8, not MB_GetVersionInfo. It looks as though the DLL can be used from an environment such as MT4, but is designed to be used from an environment such as C++, with .h and .lib files which hide translations such as MB_GetVersionInfo to __MB_GetVersionInfo@8
To check the actual exported function names, try using a tool such as
http://www.dependencywalker.com/.
N.B. This DLL will almost certainly not be usable in the next version of MT4, or not entirely usable, because the next MT4 version will require DLLs to accept Unicode strings instead of Ansi strings.
Der Quelltext, den ich hier poste, ist von mir getestet und funktioniert einwandfrei.
Mit späteren MetaTrader4-Versionen wird's allerdings ziemlich sicher nicht mehr funktionieren - schreibt er oben - weil diese nur noch Unicode-Strings und keine ANSI-Strings mehr unterstützen-
außer Deine DLL könnte später auch Unicode-Strings verarbeiten:
//+------------------------------------------------------------------+
//| membrain_test.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property indicator_separate_window
#import "MemBrainDll.dll"
int __MB_GetVersionInfo@8(string pInfo, int maxLen); // hier ist der Alias zu verwenden - ALSO NICHT: int MB_GetVersionInfo(string pInfo, int maxLen);
#import
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
int start()
{
string pInfo = " ";
int liMB_GetVersionInfo = __MB_GetVersionInfo@8(pInfo, StringLen(pInfo));
Print(pInfo); // Die Funktion "Print()" zeigt den gewünschten Text auf der Registerkarte "Experten" an, sofern man im Metatrader 4 im Menü "Ansicht" die Option "Terminal" aktiviert hat.
return(0);
}
//+------------------------------------------------------------------+
Viele Grüße
Harry