2014-12-19 4 views
2

4 개의 내 보낸 함수가있는 C++ DLL이있는 경우 DLL이로드 될 때 클래스의 객체를 구성하는 가장 좋은 방법은 (LoadLibrary까지) 어떤 클래스에서든지 해당 클래스의 public 메서드에 액세스 할 수있는 방법입니다 수출 된 기능 (extern "C" __declspec(dllexport)에 의해 수출). 나는 세계적인 것이 악하다고 기억한다. (다음은 가장 좋은 방법은 아니다) 다음을 수행하는 더 나은 방법을 찾고DLL의 내 보낸 함수에서 액세스 할 수있는 방식으로 C++ DLL에서 클래스 개체를 구성하는 가장 좋은 방법은 무엇입니까?

: 모든

namespace namespace_top_of_CMS_DLL{ 
    CMS CMS_Object  =CMS(); 
    CMS*CMS_Ptr_Object =&CMS_Object; 
} 

extern "C" __declspec(dllexport) 
void OPS_CMS_DLL_runFullStructure(){ 
    namespace_top_of_CMS_DLL::CMS_Ptr_Object->runFullStructure(); 
} 

extern "C" __declspec(dllexport) 
void OPS_CMS_DLL_runSubStructures(){ 
    namespace_top_of_CMS_DLL::CMS_Ptr_Object->runSubStructures(); 
} 

extern "C" __declspec(dllexport) 
void OPS_CMS_DLL_runReducedStructure(){ 
    namespace_top_of_CMS_DLL::CMS_Ptr_Object->runReducedStructure(); 
} 

답변

1

"다음을 수행하는 더 나은 방법을 찾고 (다음은 가장 좋은 방법은 아닙니다) : ..."

내가 글로벌 클래스 인스턴스를 넣어 원합니다 내 보낸 함수가 구현 된 번역 단위의 이름없는 네임 스페이스에 추가합니다.

헤더 파일에서 CMS CMS_ObjectCMS*CMS_Ptr_Object에 대한 선언을 제거하십시오. 또한 구현을 위해 별도의 번역 단위가 있고, 거기 exxported 함수의 인라인 정의를 이동

헤더 :

extern "C" __declspec(dllexport) 
void OPS_CMS_DLL_runFullStructure(); 

extern "C" __declspec(dllexport) 
void OPS_CMS_DLL_runSubStructures(); 

extern "C" __declspec(dllexport) 
void OPS_CMS_DLL_runReducedStructure(); 

구현

namespace { // << note no namespace here 
    CMS CMS_Object  =CMS(); 
    CMS*CMS_Ptr_Object =&CMS_Object; 
} 

void OPS_CMS_DLL_runFullStructure(){ 
    CMS_Ptr_Object->runFullStructure(); 
} 

void OPS_CMS_DLL_runSubStructures(){ 
    CMS_Ptr_Object->runSubStructures(); 
} 

void OPS_CMS_DLL_runReducedStructure(){ 
    CMS_Ptr_Object->runReducedStructure(); 
} 

당신은 보장 할 수 있습니다 그 방법, 그들은 할 수있다 내 보낸 함수 구현에서 독점적으로 액세스 할 수 있습니다.

"전 세계적인 것들은 악마입니다."

대부분의 경우 글로벌 변수는 잘못된 디자인을 나타냅니다. 이것들은 코드를 어수선하게 만들거나 의도하지 않게 다른 코드에서 사용되는 경향이 있습니다.
모듈 개인 전역을 갖는 것이 완벽합니다.

2

먼저, "전역이 악"과 같은 절대 문을 사용하지 마십시오. 어쨌든 글로벌이란 무엇입니까? 전역조차도 일부 범위가 있습니다. 그 범위가 논리적으로 이해된다면, 그것은 분명 악하지 않습니다. main은 악의가 아닙니다. 내 보낸 DLL 함수는 비슷하게 "전역"입니다. 해당 모듈과 상호 작용할 필요가 있다면 액세스 할 수있는 방법이 필요합니다.

DLL에서 하나 이상의 함수를 내 보내어 사용하려면 GetProcAddress을 사용해야합니다. 거기에서 따라야 할 패턴이 여러 개 있습니다. 가장 간단한 방법은 필요에 따라 C 스타일 함수를 내보내는 것입니다.

C++ 개체가 필요한 경우 DLLs can create a huge amount of headaches. 모든 것을 C 스타일로 내보내거나 COM을 사용하는 것이 좋습니다.

1

dll 외부의 클래스 노출에주의하십시오. C ABI는 복잡한 C++ ABI보다 훨씬 간단하고 훨씬 더 잘 정의되어 있습니다. 템플릿이 포함 된 경우 모든 보증이 창 밖으로 나옵니다.

dll과 exe를 컴파일 할 때 항상 동일한 툴체인을 사용하고 싶지 않다면 OP의 extern "C" __declspec(dllexport) 메소드를 계속 사용하십시오. 편의상 항상 C++ 래퍼 (헤더 만)를 제공 할 수 있습니다.