我正在尝试使用 VB.Net 为 MetaTrader4 创建一个 DLL。大多数示例都是用 C++ 编写的,但我知道它可以在 VB.Net 中完成。我知道它比 C++ 有点棘手。
谁能指出我正确的方向?关于定义 MT4_EXPFUNC __declspec(dllexport)
我正在尝试使用 VB.Net 为 MetaTrader4 创建一个 DLL。大多数示例都是用 C++ 编写的,但我知道它可以在 VB.Net 中完成。我知道它比 C++ 有点棘手。
谁能指出我正确的方向?关于定义 MT4_EXPFUNC __declspec(dllexport)
我终于弄清楚该怎么做。尽管这不是理想的解决方案,但它确实有效。我在这里为“后代”记录。
基本上,我正在使用一个名为 DLLExporter.Exe 的程序,它将托管的 .Net 类方法转换为直接的非托管函数。它位于: http: //www.codeproject.com/Articles/37675/Simple-Method-of-DLL-Export-without-C-CLI
我的 VB.Net 代码示例:
Imports System.Runtime.InteropServices
Public Class myFXTrader
<DllExporter.DllExport()>
Public Shared Function storeFXRatesIntoSQL(
<MarshalAsAttribute(UnmanagedType.LPWStr)> pvsBroker As String _
, <MarshalAsAttribute(UnmanagedType.LPWStr)> pvsSymbol As String _
, <MarshalAsAttribute(UnmanagedType.LPWStr)> pvsTimeStamp As String _
, pviAsk As Double _
, pviBid As Double) As <MarshalAsAttribute(UnmanagedType.LPWStr)> String
Dim vsErrorCode As String = ""
'---------------------------------
Try
'... do some work here ...
Catch ex As Exception
End Try
'---------------------------------
Return vsErrorCode
End Function
End Class
编译完上面的代码后,我就运行DLLExporter myFXTrader.dll
它,它会做的很神奇。生成的 .dll 文件可以复制到 MT4 的库文件夹中,并且可以#import
使用。请参阅下面的示例Expert Advisor
代码:
#import "FXTrader.Exports.dll"
string storeFXRatesIntoSQL(string pvsBroker, string pvsSymbol, string pviTimeStamp, double pviAsk, double pviBid);
#import
int start()
{
Comment( storeFXRatesIntoSQL( AccountCompany(), Symbol(), TimeLocal(), Ask, Bid) );
int err;
err = GetLastError();
if(err>0) { Alert( err ); }
return(0);
}
希望这会帮助那些尝试同样事情的人。我必须做很多阅读/研究才能弄清楚这一点。
您不会从 metatrader 中找到任何官方示例。他们的支持总是没有那么有用。
您提到的api确实是c ++,意思是本机。您正在寻找在 vb.net 中写一些东西。.Net 是托管代码,无论您是在寻找 vb 还是 c# 甚至是 f#,您都需要一个转换层来将本机 api 和数据结构转换为托管代码。
查看 c++/cli。Cli 是一个允许您在同一个程序集中混合本机代码和托管代码的框架。
__declspec(dllexport) 是一条指令,它告诉链接器要从本机 dll 中导出哪些函数,以便 dll 的使用者可以看到这些函数,并且可以在代码中调用它们。当您导出这样的函数时,它仍然是本机函数。
我不确定您是否尝试实现管理器或服务器 api。在管理器的情况下,整个 api 都在一个类中,指向该类的指针由管理器 dll 导出的唯一函数提供。在服务器的情况下,您是将 dll 作为插件写入服务器的人,因此理论上,您可以导出插件的每个功能,但输入和输出类型仍然是本地的,在这种情况下,您将拥有在导出的函数上编写转换器或使用 pinvoke。这是pinvoke的解释http://www.codeproject.com/Articles/4965/Using-Platform-Invoke
无论如何,您仍然需要编写本机 C++ 代码。
有一个开源项目,它让您几乎可以完全访问 mtmanapi:MetaTrader4.Manager.Wrapper。
它是用 C++/CLI 编写的,所以从 VB.NET 使用它不会有问题