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

 

나는 일종의 h-file과 같은 것을 썼습니다.


 extern __declspec ( dllexport ) int __stdcall GetIntValue ( int ) ;

그런 다음 cpp에서 그냥


int __stdcall GetIntValue(int)
 
아마도 extern 키워드 가 도움이 될 것입니다.
 
alsu >> :

...


그리고 일반적으로 문자열에 관여하지 않는 것을 선호합니다 ... 왜 dll에 전혀 필요하지 않습니까 ??? 아름다움을 위해 또는 무엇을 위해?

게다가 borland는 필요한 경우 char*를 사용하거나 메타 트레이더 방식으로 char[]를 사용할 것을 권장합니다.

 

제 생각에는 빌더에서 이와 같은 것을 선언하는 것이 옳습니다 (정확히 기억나지 않음)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

 
GarF1eld >> :

제 생각에는 빌더에서 이와 같은 것을 선언하는 것이 옳습니다 (정확히 기억나지 않음)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

에! 바로 그거죠!

 

팁 많이 주셔서 감사합니다! 이 예제는 extern "C" int __declspec(dllexport) __stdcall GetIntValue()를 선언한 후 성공했습니다.

이중 및 문자열 기능으로 시도했지만 작동했습니다. 나는 당신에게서 얻은 지식을 실제 작업에 적용하기로 결정했습니다. 그러나 아아 ... 불행히도 작동하지 않았습니다.

가능하시면 한 번만 더 도와주세요.

Builder 프로젝트 에는 DLL 생성을 위한 UHsvd.h, Usvd.cpp 등의 파일이 있습니다.

UHsvd.h 파일에는 다음과 같이 내보내야 하는 기능이 있습니다.

bool rmatrixsvd(ap::real_2d_array a,
인티엠,
국제,
불필요한,
int vtneeded,
int 추가 메모리,
ap::real_1d_array&w,
ap::real_2d_array&u,
ap::real_2d_array&vt);

Usvd.cpp 파일에는 다음과 같이 내보내야 하는 동일한 기능이 포함되어 있습니다.

bool rmatrixsvd(ap::real_2d_array a,
인티엠,
국제,
불필요한,
int vtneeded,
int 추가 메모리,
ap::real_1d_array&w,
ap::real_2d_array&u,
ap::real_2d_array&vt)

{

........

}

이 버전의 DLL 빌더에서 빌드를 시작한 다음 모든 것이 "빌드"되고 모든 것이 밝혀지고 오류가 없습니다.

UHsvd.h, Usvd.cpp를 다음과 같이 변경하기 시작하면

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a,

.....), 2에서 19까지의 오류가 다른 옵션과 함께 나타납니다. 헤더 파일이나 cpp에서 이 선언을 했습니다. 제가 이해하기로는 헤더 파일에 있어야 합니다(그런 다음 2개의 오류만 있음).

[BCC32 오류] Usvd.cpp(128): '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap: :real_2d_array &)'
[BCC32 오류] UHsvd.h(111): E2344 '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array의 이전 선언 &)'

제가 알기로는 뭔가 모순이...

여러분의 도움과 지원에 진심으로 감사드립니다...

 

boysn писал(а) >> {...}

가능하시면 한 번만 더 도와주세요.

Builder 프로젝트에는 DLL 생성을 위한 UHsvd.h, Usvd.cpp 등의 파일이 있습니다.

UHsvd.h 파일에는 다음과 같이 내보내야 하는 기능이 있습니다.

bool rmatrixsvd(ap::real_2d_array a,
인티엠,
국제,
불필요한,
int vtneeded,
int 추가 메모리,
ap::real_1d_array&w,
ap::real_2d_array&u,
ap::real_2d_array&vt); {...}

내가 올바르게 이해했다면 ap::real_1d_array는 클래스입니다. 그리고 ap::real_1d_array &는 클래스 객체에 대한 참조입니다.

하지만 친애하는, 당신은 Dll에 매개 변수로 double myData[]만 전달할 수 있습니다.

함수에서 double *처럼 보일 것입니다.

 
jartmailru писал(а) >>

내가 올바르게 이해했다면 ap::real_1d_array는 클래스입니다. 그리고 ap::real_1d_array &는 클래스 객체에 대한 참조입니다.

하지만 친애하는, 당신은 Dll에 매개 변수로 double myData[]만 전달할 수 있습니다.

함수에서 double *처럼 보일 것입니다.

전적으로 동의한다. import 하는 동안 MQL로 선언하는 것이 더블입니다. 하지만 현재로서는 C++ Builder 2009에서 DLL 자체를 생성할 수 없습니다. 빌드하는 동안 오류가 발생합니다. 광고를 사용하지 않으면

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ...), 그러면 Builder에서 라이브러리 컴파일이 문제 없이 성공적입니다. 이제 Builder 프로젝트 자체에서 함수 내보내기를 올바르게 선언하는 방법을 모르겠습니다.

rmatrixsvd 함수를 내보내는 기능이 있는 작업 DLL

 
boysn >> :

전적으로 동의한다. import 하는 동안 MQL로 선언하는 것이 더블입니다. 하지만 현재로서는 C++ Builder 2009에서 DLL 자체를 생성할 수 없습니다. 빌드하는 동안 오류가 발생합니다. 광고를 사용하지 않으면

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, .., ....), 그러면 Builder에서 라이브러리 컴파일이 문제 없이 성공적입니다. 이제 Builder 프로젝트 자체에서 함수 내보내기를 올바르게 선언하는 방법을 모르겠습니다.

rmatrixsvd 함수를 내보내는 기능이 있는 작업 DLL

브르르 어쩐지 당신은 이상하게 내 말에 동의합니다.

.

실제로 "어댑터" 또는 "브리지"를 작성하는 것입니다.

내보낸 기능의 매개변수라는 의미에서 "어댑터"

메타 트레이더가 보낼 수 있는 매개변수와 일치해야 합니다.

저것들. 필요한 곳으로 호출을 전송하는 추가 기능이 필요합니다.

그리고 "Bridge" - 기능이 반드시 필요하지 않다는 관점에서,

당신이 선언 한 작업은 스스로했습니다.

그 반대의 경우도 마찬가지입니다. 작업을 수행하는 함수를 호출할 필요가 없습니다.

.

저것들. 인터페이스와 구현을 분리해야 합니다. 구현은 클래스를 기반으로 할 수 있습니다.

Dll 외부의 누구도 알 수 없는 기능.

.

하지만 예를 들어 보겠습니다.

.

다음과 같이 선언해야 합니다.

extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)

// 물론 여기에서 행과 열의 수도 전달합니다.

{

// 입력 매개변수를 ap::real_2d_array로 변환

ap::real_2d_array a1 = 변환PDoubleToReal2DArray(in1);

ap::real_2d_array a2 = ...;

.

// 계산하다

ap::real_2d_array a3;

rmatrixsvd(a1, a2, a3);

.

// 3의 결과를 out으로 변환

convertReal2DArrayToPDouble(a3, 출력);

.

반품;
}

.

이 경우 - 물론 - rmatrixsvd 함수

extern "C", __stdcall, __declspec 등이 선언되지 않았습니다.

내부의 숨겨진 구현에 포함되어 있기 때문입니다.

 

죄송합니다, 잘 이해하지 못했습니다...

http://alglib.sources.ru/ 사이트에서 C++에 필요한 구현(코드)을 다운로드했습니다. 실례가 되지 않는다면 첨부된 100Kb 아카이브를 살펴보시기 바랍니다. 이 알고리즘은 많은 보조 기능을 가지고 있으며, 코드의 총 줄 수는 대략 3000줄 정도 ... 제 생각에는 그래서

그것은 쓰여진 사이트에, 즉. 많이 있고 MQL로 번역하기가 다소 어렵습니다... 동시에, 제대로 전송을 하기 위해서는 알고리즘 자체에 대한 이해가 필요합니다. 저에게는 현재가 어렵습니다. 따라서 C ++ Builder 2009에서 이 기성품 코드를 사용하여 dll을 만들고 dll에서 호출하여 필요한 rmatrixsvd (...) 함수에 액세스하고 싶습니다. 이 모든 것에서 나는 혼란스러워했습니다 ... 올바르게 선언하는 위치와 방법 ... 이 코드의 도움으로 한 줄도 변경하지 않고 오류없이 DLL이 빌드됩니다. 하지만 extern "C" bool __declspec(dllexport) __stdcall을 거기에 넣으면 오류가 시작됩니다...

시간 내 주셔서 감사합니다.

파일:
svdy1e.cpp.zip  94 kb
사유: