在编程中,我们经常需要使用一些在其他模块中定义的外部函数。MQL4中的外部函数使用也是如此,这些函数必须明确地进行描述。该描述包括返回类型、函数名称以及一系列输入参数及其类型。如果没有这样的描述,可能会在编译、构建或执行程序时出错。在描述外部对象时,我们使用#import关键字来指明模块。
例如,如果我们想从”user32.dll”中导入MessageBoxW和SendMessageW函数,或者从”lib.ex4″中导入round函数,我们可以这样写:
#import "user32.dll"
int MessageBoxW(int hWnd ,string szText,string szCaption,int nType);
int SendMessageW(int hWnd,int Msg,int wParam,int lParam);
#import
#import "lib.ex4"
double round(double value);
#import
这样,我们就可以方便地描述从外部DLL或编译的EX4库中调用的函数。EX4库是编译的ex4文件,具有库属性。只有用export修饰符描述的函数才能从EX4库中导入。
需要注意的是,如果同时导入的DLL和EX4库应该有不同的名称(无论它们位于哪个目录)。所有导入的函数都具有与库的”文件名”对应的作用域解析。
如果在程序中从不同的执行环境使用了同名的多个函数,可能会造成歧义。为了避免函数调用的歧义,我们应始终使用作用域解析操作符明确指定函数的作用域。
下面是一个示例,我们创建了一个名为CFoo的类,并在其中定义了一个GetLastError的方法。同时,我们也从”kernel32.dll”和”lib.ex4″导入了同名的GetLastError函数。在CFoo类的func方法中,我们通过作用域解析操作符调用了这些同名函数。
#import "kernel32.dll"
int GetLastError();
#import "lib.ex4"
int GetLastError();
#import
class CFoo
{
public:
int GetLastError() { return(12345); }
void func()
{
Print(GetLastError()); // 调用类方法
Print(::GetLastError()); // 调用MQL4函数
Print(kernel32::GetLastError()); // 调用来自kernel32.dll的DLL库函数
Print(lib::GetLastError()); // 调用来自lib.ex4的EX4库函数
}
};
void OnStart()
{
CFoo foo;
foo.func();
}
总结来说,MQL4中的外部函数使我们能够轻松地调用其他模块中的函数。这种机制不仅可以提高代码的复用性,还可以使我们的程序更为模块化。然而,我们需要注意的是,对于同名的函数,我们需要通过作用域解析操作符来避免歧义,以确保我们调用的是正确的函数。