2011-04-11 2 views
2

혼합 DLL을 참조하는 응용 프로그램 (CLI)이 있습니다. DLL은 정적 함수가있는 "ref"클래스를 구현합니다.C++에서 ref 클래스 함수 호출 (혼합 코드)

// This works 
AAA::Write("hello"); 

// This doesn't !!! 
CRect rc(0, 0, 12, 234); 
AAA::TraceRect(rc); 

어떻게 할 수 있습니다 여기에

는 심판 수준의 EXE 파일 내에서

public ref class AAA 
{ 
public: 
static bool Write(System::String^ sz); 

// Not accessible!!! 
public: static BOOL TraceRect(const CRect& rc); 
}; 

의 (부분) 코드, C에서 + + 코드, 나는 두 함수를 호출하기 위해 노력하고있어 두 번째 기능에 액세스합니까?

+1

이것은 나에게 C++처럼 보이지 않습니다. –

+1

'C++ - cli' 태그가 추가되어 더 많은 도움이 될 것입니다. – Xeo

+0

그냥 짐작 하겠지만 관리되는 클래스의 정적 메서드에 관리되지 않는 데이터 형식을 넣었습니다. 또한 CLR에서는 'const'를 지원하지 않으므로 클래스를 IL로 컴파일 할 때 어떻게 해석해야할지 모르겠습니다. 관리되지 않는 정적 메서드를 관리되는 클래스에 넣는 대신 개별 위치로 분할합니다. –

답변

4

기본 유형 (이 경우 CRect)이 기본적으로 개인용으로 취급되기 때문일 수 있습니다. 따라서 메소드에 액세스 할 수있는 동안 rc의 매개 변수 유형에 액세스 할 수 없습니다. make_public을 사용하여 액세스 가능하게 만들 수 있습니다. http://msdn.microsoft.com/en-us/library/ms235607.aspx

C3767 및 make_public을 검색하면 주제에 대한 많은 정보를 찾을 수 있습니다.

+0

좋은 생각이지만 작동하지 않습니다. 나는 'CRECT'를 'RECT'로 변경하려고 시도했는데 ... 이제 DLL도 링크되지 않고 LNK2022 (메타 데이터)를 얻습니다. – Seb

+0

문제의 원인을 찾으십시오. * 매개 변수가없는 경우 문제가 발생합니다. CRect와 RECT 사이의 변경은 실제로 새로운 것을 시도하지 않습니다. 두 가지 모두 여전히 기본 유형입니다. –

+0

@Seb :'#pragma make_public (CRect)'가 작동해야합니다. CRect가 네임 스페이스에 속한다면,'make_public'에 대해 NAMESPACE :: CRect' –

관련 문제