dll에서 함수를 가져오는 문제를 이해하는 데 도움이 됩니다.

 

dll에서 함수를 가져오는 방법을 배우고 싶습니다. 다른 옵션을 시도했지만 오류가 계속 나타납니다. dll에서 함수를 호출할 수 없습니다(오류 127).

1. C++ Builder 6에서 내 프로젝트 컴파일 시도

2. C++Builder 2009의 동일한 프로젝트

3. C++ Builder 2009의 DLLSample 예제에서 프로젝트 생성, 컴파일

모든 곳에서 동일한 결과: dll에서 함수를 호출할 수 없습니다(오류 127).

확인을 위해 MetaTrader 4와 함께 제공되는 DLLSample 예제의 C++ Builder 2009에서 PExpDll.dll이 컴파일된 라이브러리인 스크립트를 사용합니다.

스크립트는 다음과 같습니다.

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#속성 링크 " https://www.metaquotes.net// "

#import "PExpDll.dll"
정수 GetIntValue(int);
더블 GetDoubleValue(더블);
문자열 GetStringValue(문자열);
#수입

//+----------------------------------------------- ------ --------------------+
//| 스크립트 프로그램 시작 기능 |
//+----------------------------------------------- --------------------+
정수 시작()
{
//----
Print("스크립트 시작");
GetStringValue("이것이 작동하는지 궁금합니다.");
GetIntValue(10);

//----
리턴(0);
}
//+----------------------------------------------- ------ --------------------+

도와주세요, 제가 뭘 잘못하고 있는 걸까요...

미리 감사드립니다.

 

옵션 1) def 파일을 저장할 위치를 파악합니다. 그것 없이는 아마 아무데도 가지 못할 것입니다.

옵션 2) Visual Studio 설치

 

ㅋㅋㅋ

옵션 3:

최악의 경우 VB Excel에서도 테스터가 있습니다. 요청한 기능이 호출되는지 확인하십시오.

그렇지 않은 경우 - 링커 설정이 비뚤어진 것입니다. 예 - MQL 설명의 오류가 아닙니다.

MT4 설치에는 좋은 C 소스 DLL이 함께 제공됩니다. 이를 연습하고 많은 시간을 절약하십시오.

 
boysn >> :

#import "PExpDll.dll"
정수 GetIntValue(int);
더블 GetDoubleValue(더블);
문자열 GetStringValue(문자열);
#수입

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 함수를 호출하는 Service-Settings-Experts-Confirm에 체크 표시가 있습니다. 그래서 스크립트를 실행하면 그런 함수를 호출할지 말지...? "예"를 선택하고 오류는 다음과 같습니다. dll에서 함수를 호출할 수 없습니다(오류 127).

2. Double GetDoubleValue(double) 유형의 매개변수가 없는 함수 선언의 경우, 특히 컴파일러가 이에 대해 맹세하지 않기 때문에 이러한 방식으로 예제에 작성되므로 이것이 정상입니다.

3. def 파일의 경우.. 물론 그것 때문일 수도 있지만, 사실 어디에 넣어야 할지 막막합니다. 이 확장자를 사용하는 C++Builder 6 및 2009 프로젝트에는 이러한 파일이 없습니다. dll 자체를 조립할 때 붙일 곳이 없는 것 같습니다. \MetaTrader 4\experts\libraries 폴더의 같은 이름 아래 같은 폴더에서도 올바르지 않습니다... 시도했습니다... 한마디로 명확하지 않습니다. 기성 시스템 dll이 사용되는 다른 예를 시도했습니다.

#가져오기 "kernel32.dll"
int _lopen (문자열 경로, 정수);
int_lcreat(문자열 경로, int 속성);
int_llseek(int 핸들, int 오프셋, int 원점);
int _lread(int 핸들, 문자열 버퍼, int 바이트);
int_lwrite(int 핸들, 문자열 버퍼, int 바이트);
int _lclose(int 핸들);
#수입

이러한 함수를 호출합니다.. DLLSample의 이유가 명확하지 않습니다.
이유가 링커라면 무엇이 있을 수 있습니까? 파일이 오프라인 상태가 되도록 하는 것 같습니다.

M..예.. 명확하지 않습니다. MT4의 예제가 정확히 작동합니까? 작동하는지 확인하기 위해 테스트한 사람이 있습니까?

응답해 주시고 응답해 주신 모든 분들께 감사드립니다.

 
빌더에서 함수 선언을 볼 수 있습니까? 어떻게 문자열 매개변수를 전달하고 동일한 유형의 결과를 반환합니까? 빌더는 문자열로 작업할 때 몇 가지 특성이 있습니다...
 
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) 작업 예. 건설하지 마십시오.

나는 일반적으로 디빌더에서 mt4용 dll을 만들었는데 def 파일이 유용하지 않았습니다 ...

 
boysn >> :

이유가 링커라면 무엇이 있을 수 있습니까? 파일이 오프라인 상태가 되도록 하는 것 같습니다.


프로젝트 설정의 컴파일러 링커 및 패키지 탭을 스크린샷할 수 있습니까?

 
alsu >> :

나는 일반적으로 debuilder에서 mt4 용 dll을 만들었는데 def 파일이 유용하지 않았습니다 ...

동료와 예시를 공유하세요 :-).

아마도 거기에서 함수를 선언하기 전에 일종의 구불구불한 글씨를 작성해야 할 것입니다.

.

그리고 빌더는 ... 나는 여전히 4개의 서비스 팩이 있는 6개의 복사본을 가지고 있습니다.

재미있는 사건이 있은 후 사용을 중단했습니다 :-).

.cpp 파일에 기능을 추가합니다. 다른 결함이 응답으로 시작됩니다 :-).

결함은 빌더가 스택을 통해 함수에 전달된 매개변수에 대해 거짓말을 했다는 것입니다.

기능을 삭제하면 모든 것이 다시 정상입니다.

모듈에서만 사용할 수 있는 전역 변수를 호출할 수도 있습니다.

그것들이 선언되고 나머지에서 쓰레기가 보입니다 :-).