帮助解决从dll中导入函数的问题

 

我想学习如何从dll中导入函数。我已经尝试了不同的变体,但下面的错误一直出现:不能从dll中调用函数(错误127)。

1.我试着在C++ Builder 6中编译我的项目。

2.同一项目在C++ Builder 2009中。

3.我在C++ Builder 2009中根据DLLSample的例子创建了一个项目,并将其编译。

到处都是同样的结果:不能从dll调用函数(错误127)。

为了测试它,我用PExpDll.dll的脚本--在C++ Builder 2009中编译的库,来自DLLSample例子,它是MetaTrader 4附带的。

这里是这个脚本。

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#属性链接"https://www.metaquotes.net//"

#import "PExpDll.dll"
int GetIntValue(int)。
double GetDoubleValue(double)。
string GetStringValue(string)。
##进口

//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
int start()
{
//----
Print("Script start");
GetStringValue("I wonder if this will work?")。
GetIntValue(10)。

//----
return(0);
}
//+------------------------------------------------------------------+

请帮助我,告诉我我做错了什么...?

预先感谢你。

 

选项1)弄清楚把def文件放在哪里。没有它,你可能不会有任何进展。

选项2)安装Visual Studio

 

大笑

选择3。

有测试人员,至少从VB的excel--检查请求的函数是否被调用。

如果没有--链接器设置不良,有--不是MQL描述中的错误

随着MT4的安装,一个很好的C源DLL被送来--用它来训练,它将节省大量的时间。

 
boysn >> :

#import "PExpDll.dll"
int GetIntValue(int)。
double GetDoubleValue(double)。
string GetStringValue(string)。
##进口

根据MQL-4中函数声明的规则,你有一个明显的错误。

int GetIntValue(int X);
double GetDoubleValue(double X);
string GetStringValue(string X);

没有输入参数名称,只有类型。这在MQL-4中是不允许的。

 
Urain >> :

根据MQL-4的函数声明规则,有一个明显的错误。

没有输入参数名称,只有类型。在MQL-4中,这是不允许的。

编译器不发誓的东西,你可以。

我试着这样写。

#import "timeService.dll"
// функция, выдающее смещение от Utc 
// до времени сервера и до локального времени
int timeService(
  string , //  <--- убрал имя переменной
  int & utcToServer[],
  int & utcToLocal[]  );
#import

一切运作正常。

实际上,根据C和C++的教条,你根本不需要指定参数名。

此外,在大多数情况下,程序员正忙于坐在那里对它们进行评论。

 

非常感谢您的建议,感谢您的回复。

1.在MT4中,我勾选了服务-设置-顾问-确认调用 dll的功能。所以,当我运行脚本时,它会问我是否应该调用这样的函数...?我选择了 "是",然后出现了以下错误:不能从dll调用函数(错误127)。

2.没有参数的函数声明怎么办,比如double GetDoubleValue(double),样本中是这样写的,尤其是编译器没有抱怨,所以是可以的。

3.但是def-file怎么办...当然,也许是因为def-file,但我真的不知道该把它放在哪里。在C++ Builder 6和2009项目中,没有这样的扩展文件,也就是说,在构建dll本身时,似乎没有地方可以放置它。在同一文件夹下的同一名称下,在\MetaTrader 4/experts/libraries文件夹是不一样的...试过了...简而言之,这并不清楚。尝试了另一个例子,其中使用了一个现成的系统dll

#import "kernel32.dll"
int _lopen (string path, int of);
int _lcreat (string path, int attrib);
int _llseek (int handle, int offset, int origin);
int _lread (int handle, string buffer, int bytes);
int _lwrite (int handle, string buffer, int bytes);
int _lclose (int handle);
##进口

这些功能被调用。DLLSample的原因尚不清楚。
如果原因在链接器中,那会是什么原因呢?我似乎是在使文件独立。

呃......是的,我不明白。而MT4中的例子肯定是有效的?有谁检查过它,看看它是否有效?

谢谢你们所有人的回应和回复。

 
你如何将字符串参数传递给它并给出相同类型的结果? Bilder在处理字符串时有其特殊性......
 
boysn >> :

{...}3.至于def文件...当然,这可能是因为它,但真的不知道该把它放在哪里。在C++ Builder 6和2009项目中,没有这种扩展名的文件,也就是说,在构建dll本身时,似乎没有地方可以粘贴它。在同一文件夹下的同一名称下,在\MetaTrader 4/experts/libraries文件夹是不一样的...试过了...简而言之,这并不清楚。尝试了另一个例子,它使用了一个现成的系统dll {...}。

这些功能被称为...DLLSample的原因尚不清楚。
如果原因在链接器中,会是什么原因呢?我似乎是在使文件独立。

M...对...不清楚。在MT4中的例子确定是有效的吗?有没有人测试过它是否有效?

谢谢你们所有人的回应和回复。

1)即使建设者是咳咳..."稍有 "错误,仍然需要def文件

2) 你尝试安装Visual Studio了吗?

3) 例子有效。错误的建造者。

 
jartmailru >> :

1)尽管建设者是咳咳......"稍有 "错误,仍然需要def文件

2)你还没有尝试过Visual Studio

3) 例子有效。错误的建造者。

我实际上是在bilder上为mt4做了dlls,def-file没有用。

 
boysn >> :

如果林克是原因,那么那里会有什么呢?我似乎要把文件独立出来。


你能拍一张项目设置中的编译器、链接器和包的截图吗?

 
alsu >> :

我曾经在dibilder上为mt4制作dlls,def-file没有用。

与同事分享一个例子:-)。

也许你需要在那里的函数声明前写一些方块字。

.

和图片...我还有一份6的副本,上面有4个服务包。

在一个有趣的案例后停止了使用:-)。

当我在一个.cpp文件中添加一个函数时,我得到了各种故障:-)。

漏洞在于,构建者会对通过堆栈传入函数的参数撒谎。

你删除了这个功能--一切又都正常了。

我还可以回忆起全局变量,这些变量只能从一个模块中访问。

在它们被宣布的地方,从其余的地方你看到的是垃圾:-)。