DLL 질문.... - 페이지 6

 
그건 그렇고, 좋은 물건 http://www.parashift.com/c++-faq-lite/index.html .
 
질문은 여전히 저자와 관련이 있습니까? 나는 나 자신을 위해 dll을 작성 중이며 작은 예를 스케치할 수 있습니다.
 
네 해당됩니다!!! 당신 덕분에 dll을 알아 냈습니다! 고맙습니다 ! 하지만 dll에 넣는 방법을 알 수없는 것들이 있습니다.
 

1. 함수는 특정 규칙에 따라 호출됩니다 - 호출 규칙. MT4는 __stdcall (규칙 종류의 특별한 경우)을 준수하는 기능과 함께 작동하도록 보장됩니다. 내보낸 함수 가 위의 규칙을 사용하도록 하려면 다음과 같아야 합니다. void __stdcall AnyFn();

2. 라이브러리 함수를 강제로 내보내는 두 가지 방법을 알고 있습니다. __declspec(dllexport) 사용과 def 파일 사용(이 방법이 더 쉽습니다. 그렇지 않으면 장식 기능도 처리해야 합니다). VS에서 프로젝트에 def 파일을 포함하려면 먼저 프로젝트 파일에 추가한 다음 파일 이름을 프로젝트 속성/링커/입력/모듈 정의 파일에 추가합니다.

추신: 샘플 프로젝트 def 파일은 다음 위치에 있습니다. 터미널 디렉토리\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에서 변수를 변경할 때 MCL에는 변경 사항이 없습니다.

#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. 문자열에서 배열을 전달할 때 struct MqlStr 구조가 DLL에 전달됩니다.

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

#import "myLib.dll"

void fn( string var[]);

#import

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

void __stdcall fn(MqlStr *var) {}


추신

배열이나 문자열(문자열)이 DLL에 전달될 때마다 메모리 영역(포인터)에 대한 포인터가 실제로 DLL로 전송되며 라이브러리에서는 이를 다음과 같이 수락합니다.

void __stdcall fn(int *pointer) {} // 그렇습니다. 따라서 포인터[4] = 4와 같이 배열처럼 작업할 수 있습니다.

void __stdcall fn(int &reference) {} // 정도. 그러나 우리는 하나의 요소에만 액세스할 수 있습니다. 한 요소의 배열을 라이브러리에 전달할 때 실제입니다.

 
#import "myLib.dll"

void fn( string var);

#import

DLL:

void __stdcall fn( char *pointer) {}

포인터 앞에 * 기호에 대한 합리적인 설명을 찾을 수 없습니다. 왜 필요한가요 ??? 없으면 안되는건가요????

그리고 dll에서 텍스트를 수신하는 것과 같은 과정에 대한 질문???

 
VOLDEMAR :

* before 포인터에 대한 합리적인 설명을 찾을 수 없습니다. 왜 필요한가요 ??? 없으면 안되는건가요????

그리고 dll에서 텍스트를 수신하는 것과 같은 과정에 대한 질문???

당신은 그것에서 텍스트를 받아서는 안됩니다. 적어도 올해.
 

1. 문자열을 MCL로 전송:

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. 문자열을 MCL로 전송:

2. * 기호는 이것이 포인터임을 나타냅니다. 요컨대, 모든 변수에는 값뿐만 아니라 메모리에서 해당 변수가 위치한 주소도 있습니다. 포인터는 이 주소로 작동할 수 있습니다. 이 질문은 잘 이해해야 합니다. C ++에 대한 책에 주의를 기울일 가치가 있다고 생각합니다.
네, 바로 제가 하고 있는 일입니다. 저는 C++를 사용하고, 비디오를 보고, 책을 읽습니다. 이제 MKL 5가 많이 밝혀졌습니다 .......
 

전역 라이브러리 데이터에 주의하기만 하면 됩니다. LCL 프로그램은 서로 독립적으로 실행되지만(하나의 스레드에 있기 때문에 공통 전역 변수 가 있음) 여러 스크립트가 동일한 메모리 영역에 쓰기 및 읽기를 시작하는 상황(좋지 않음)이 발생할 수 있습니다. 예를 들어 임계 섹션을 사용하여 여기에서 동기화가 필요합니다. 나는 이것이 전역 데이터와 관련이 있음을 강조합니다(함수 외부에서 선언됨). 함수가 호출되면 자체적이고 독립적인 변수 집합이 생성됩니다.