诚信为本
量力而为
当前位置:ea编程网 EA知识 正文

MQL4中的外部函数详解

在编程中,我们经常需要使用一些在其他模块中定义的外部函数。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中的外部函数使我们能够轻松地调用其他模块中的函数。这种机制不仅可以提高代码的复用性,还可以使我们的程序更为模块化。然而,我们需要注意的是,对于同名的函数,我们需要通过作用域解析操作符来避免歧义,以确保我们调用的是正确的函数。

未经允许不得转载:ea编程网 » MQL4中的外部函数详解