关于DLL的问题 ...... - 页 6

 
顺便说一句,好东西http://www.parashift.com/c++-faq-lite/index.html
 
这个问题还与作者有关吗?我正在为自己写一个dll,我可以给你一个小例子。
 
是的,它是!!!。多亏了你,我已经整理好了文件库。谢谢!但有些东西我不知道如何把它们放进dll里 !
 

函数的调用是根据一定的规则--调用惯例。MT4保证与遵守__stdcall (规则变体的一种特殊情况)的函数一起工作。 为了确保导出的函数 使用上述规则,它应该像这样:void__stdcall AnyFn()。

2.我知道有两种方法可以使库函数导出 - 用__declspec(dllexport) 和用def文件(这更容易,否则你还得在函数解码上费劲)。在VS中,要在项目中包括def文件,首先要添加到项目文件中,然后将文件名添加到:项目属性/composer/input/module定义文件。

P.S:带有def文件的项目实例 ,位于:terminal directory/ experts/samples/DLLSample。



 

向dll函数传递参数

1.当传递字符串变量时,一个char数组(ANSI字符,需要1个字节)被传递给DLL。

#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}


2.向库传递int或double将导致变量被复制,因此当你改变dll中的变量时,dll中没有变化。

#import "myLib.dll"

void fn(int var);

void fn(double var);

#import

DLL:

void __stdcall fn(int var) {}


3.为了能够改变在MQL中声明的int和double变量,应该传递数组。

#import "myLib.dll"

void fn(int var[]);

void fn(double var[]);

#import

DLL:

void __stdcall fn(int *var) {}

void __stdcall fn(double *var) {}


4.当从字符串传递一个数组时,MqlStr结构被传递给DLL。

МКЛ прототип:

#import "myLib.dll"

void fn(string var[]);

#import

DLL:
struct MqlStr
{
   int len;
   char *string;
};

void __stdcall fn(MqlStr *var) {}


P.S.

每当一个数组或一个字符串(string)被传递给DLL时,它实际上是一个指向内存部分的指针(pointer),该指针被传递给库,如下所示

void __stdcall fn(int *pointer) {} // 像这样。这样你就可以作为一个数组工作,例如,pointer[4] = 4。

void __stdcall fn(int &reference) {} // 或如此。但我们将只获得一个元素的访问权。 当把一个元素的数组传入库中时,它是相关的。

 
#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}

我找不到关于指针 前面的*的正确解释,它的作用是什么?难道不可以不这样做吗??????

还有一个问题,如何从dll中获取文本?

 
VOLDEMAR:

我找不到关于指针前面的*的正确解释,它的作用是什么? 难道不可以不这样做吗??????

还有一个问题,如何从dll中获取文本?

你不需要从它那里得到文本。 至少今年没有。
 

1.将一个字符串传输到IDC。

DLL:
#include <string.h>
void __stdcall Temp(char *mqlStr)
{
   size_t mqlStringSize = strlen(mqlStr);
   char stroka[] = "DLL string";          // Эту строку передадим в MQL.
   if(strlen(stroka) > mqlStringSize)
      stroka[mqlStringSize] = '\0';       // Добавляем нуль-терминатор (обозначает конец строки).
   strcpy(mqlStr, stroka);
   return;
}

MQL:
#include "WaveCounter.dll"
void Temp(string str);
#include
int start()
{ 
   string str = "wwwwwsff";    // Задаем длину строки; Если длина будет меньше необходимого, то строка будет урезана.
   Temp(str); 
   Alert(str); 
   return;
} 
2.符号*表示它是一个指针。简而言之,任何变量不仅有一些值,而且还有它在内存中的地址。指针可以与这个地址一起工作。这是一个需要很好理解的问题,我想你应该去看看C++的书。
 
220Volt:

1.将一个字符串传输到IDC。

2.符号*表示它是一个指针。简而言之,任何变量不仅有一些值,而且还有它在内存中的地址。指针可以与这个地址一起工作。这是一个需要很好理解的问题,所以你可能想去看看一些C++的书。
这就是我正在做的事情。我在使用C++,看视频,看书。现在,MKL 5的大部分内容都变得清晰了 .......
 

你只需要小心处理库中的全局数据。MCL程序彼此独立运行(但共享全局变量,因为它们在同一个线程中),因此有可能几个脚本会写入和读到同一个内存位置(这不是好事)。这需要同步化,例如通过使用关键部分。我强调,这对全局数据(在函数之外声明的)是真实的。当函数被调用时,它们自己的、独立的变量集被创建。