2011-03-16 2 views
0

그래서 몇 년 후에 에뮬레이션을 시작하고 어디서부터 시작해야할지 모르는 사이에 에뮬레이션에서 손을 시험하기 시작했으며 성공적으로 첫 번째 에뮬레이터를 작성했습니다. 이제 다른 시스템을 에뮬레이트하기 위해 코드를 재사용 할 수 있도록 코드를 구성하고 있습니다. 나는 플랫폼 핸들러가 사용할 수있는 것을 식별하고 인스턴스화하는 데 사용할 DLL에 에뮬레이트 된 시스템 코드를 컴파일하는 반면에 실행 가능한 것으로 컴파일 할 종류의 공유 ​​프론트 엔드 "플랫폼 핸들러"를 가지고 생각하고있다. . 이렇게하면 내 코드를 다른 프로젝트로 분리하고 더 많은 기능 또는 간소화 된 "게임 전용"을 포함한 더 큰 프런트 엔드를 사용하고 두 가지 솔루션을 만드는 대신 동일한 DLL을 공유 할 수있는 옵션을 열어 둘 수 있습니다.VC++ : DLL을 "서브 프로그램"으로 사용

나는 DLL 대 실행 파일을 컴파일하는 방법을 알고 있지만 실행 파일을 사용자 정의 DLL에 연결하여 그 클래스를 인스턴스화 할 수있는 방법을 모른다. 내가 뭘하려고하는지조차도 기술적으로 가능하지 않다. dll 클래스는 정적이어야합니까? 필자는 전에도 이와 같은 내용을 코딩하지 않았으며 사용자 지정 dll을 많이 사용하여 도움이나 아이디어를 얻을 수있었습니다. 나는 Visual C++ 2010을 사용하고 있습니다. 누구든지 가질 수있는 조언에 미리 감사드립니다.

+0

이것은 MSDN Library에서 다루고 있습니다. 여기를 읽기 시작하십시오 : http://msdn.microsoft.com/en-us/library/1ez7dh12.aspx –

답변

0

정말 다르게 할 필요는 없습니다. 함수처럼 DLL에서 클래스를 내보내십시오. 귀하의 응용 프로그램에서 일반적으로 당신처럼 생성 된 lib에 헤더와 링크를 포함하십시오. 당신의 DLL 프로젝트에서 http://msdn.microsoft.com/en-us/library/81h27t8c%28v=vs.80%29.aspx

Example.h

#ifdef DLL_EXPORT 
#define EXPORT_API __declspec(dllexport) 
#else 
#define EXPORT_API __declspec(dllimport) 
#endif 

class EXPORT_API Example 
{ 
public: 
    Example(); 
    ~Example(); 

    int SomeMethod(); 
}; 

int EXPORT_API ExampleFuncion(); 

#include "Example.h" 

Example::Example() 
{ 
    // construct stuff 
} 

Example::~Example() 
{ 
    // destruct stuff 
} 

int Example::SomeMethod() 
{ 
    // do stuff 
    return 0; 
} 

int EXPORT_API ExampleFunction() 
{ 
    return 0; 
} 

Example.cpp

DLL_EXPORT을 정의하고 구축이 페이지를 참조하십시오. .lib.dll 출력이 표시됩니다. 주 프로젝트에서 dll을 사용할 곳을 제외하고는 아무 것도 할 필요가 없습니다. .lib에 대한 헤더와 링크를 포함하십시오. 주 프로젝트에 DLL_EXPORT 기호를 정의하지 말고 .dll이 응용 프로그램에서 찾을 수있는 곳인지 확인하십시오.

정말로 영리 해지기를 원하면이 문제는 공장 설계 패턴에 대해 비명을 지르는 것입니다. 인터페이스를 충분히 설계하면 dll이로드 될 때 DLL을 응용 프로그램에 등록하도록 할 수 있습니다. 주 실행 파일을 다시 빌드하지 않고도 영원히 확장 할 수 있습니다.

+0

그것은 내가하고 싶은 것처럼 많이 들립니다. 이 OS는 구체적입니까? 지금까지 내 응용 프로그램은 크로스 플랫폼 친화적이며 실제로 그렇게하고 싶습니다. MSDN의 방향에 관계없이 좋은 리소스 임에도 불구하고 필자는 긴장하게됩니다. – user663000

+0

아니요, 저는 Windows와 Linux 모두에서이 작업을 수행했습니다. 공유 객체로드를 지원하는 모든 플랫폼에서 작동한다고 가정합니다. 리눅스에서 IIRC 당신은 특별한 일을 할 필요가 없습니다, 그냥 공유 객체 (dll)을 만들고 그것에 대해 링크를 만듭니다. Windows에서는 링크를 통해 명시 적으로 클래스를 내 보낸 것으로 선언해야합니다. 나는 코드 스 니펫 (snippet)을 편리하게 가지고 있지 않으며 아마도 뭔가를 그리워 할 것이므로 기억에서 하나를 만드는 것을 망설이다. google에서 dllimport/dllexport를 살펴보십시오. 나는 직장에서 집에 돌아 왔을 때 다시 확인하고 더 좋은 예를 제시하려고 노력할 것입니다. –

+0

와우, 정말 고마워! 이것은 정확하게 내가 어떻게하고 싶은지를 보여줍니다. 팩토리 메서드는 플랫폼 처리기를 설정하는 완벽한 방법 인 것처럼 들립니다. ol '디자인 패턴 책을 떨어져 먼지에 시간과 코딩을! – user663000