2011-03-06 4 views
0

나는 C++에서 실행 가능한 C++ 실행 파일이 dll을로드하고 GetProcAddress를 통해 plugin_start (someclass &)를 실행하고 있습니다.C++ Windows 플러그인 - 클래스 전달하기

나는 완전히 어떻게 DLL은 헤더 파일에 정의 된 것을 사용할 수있다 DLL 및 비자 반대, 그리고에 함수 포인터를 전달하는,하지만 난 someclass이 어디 DLL을 사용할 수 someclass 싶습니다 방법을 이해 someclass.h에서 선언되었지만 someclass.cpp에서 정의되었습니다.

캐치는 someclass가 실행 파일 실행 파일로 컴파일되므로 dll이 함수를 호출하려고하면 링커 오류가 발생합니다. 나는 이것이 왜 있는지 이해한다. 내가 이해하지 못하는 것은 내가 원하는 것을 성취하는 방법이다.

나는 포인터를 함수에 전달할 수 있다고 상상한다. 즉, someclass * somefunction *을 호출 한 다음 someclass -> * somefunction()이라고 부른다. 그러나 이것은 모든 포인터를 전달해야 함을 의미한다. 모든 클래스의 기능

더 쉬운 방법이 있나요? 아니면 C 스타일의 함수와 함수 포인터 만 사용해야하고 둘 사이에 전체 클래스를 전달하는 것을 잊지해야합니까?

감사합니다,

#ifndef EVENTREGISTRAR_H 
#define EVENTREGISTRAR_H 
#include <vector> 

typedef void (__stdcall *error_callback_t)(const char *error); 

class EventRegistrar 
{ 

public: 
    void OnError(error_callback_t fn); 
    void FireError(const char *error); 


private: 
    std::vector<error_callback_t> errors; 

}; 
#endif 

- CPP

#include "PluginLoader.h" 
void EventRegistrar::OnError(error_callback_t fn) 
{ 
    this->errors.push_back(fn); 
} 

void EventRegistrar::FireError(const char *error) 
{ 
    for (std::vector<error_callback_t>::iterator it = this->errors.begin(); 
     it != this->errors.end(); ++it) 
    { 
     (*it)(error); 
    } 
} 

- DLL

#include "../plugin.h" 
#include <stdio.h> 
void __stdcall error(const char *error) { printf("Error: %s\n",error); } 
extern "C" int __stdcall plugin_start(plugin_start_data& data) 
{ 
    error_callback_t fn = error; 
    data.events.OnError(fn); 
    return LOAD_SUCCESS; 
} 

--error

Error 1 error LNK2001: unresolved external symbol "public: void __thiscall EventRegistrar::OnError(void (__stdcall*)(char const *))" ([email protected]@@[email protected]@Z) D:\Files\C++ Workspace\BLib\BLib\Example Plugin\main.obj Example Plugin 
+0

DLL 경계를 넘어 STL 개체를 전달하는 것은 좋지 않습니다. 인터페이스를 구현과 분리하여이를 피할 수 있습니다. – Luke

답변

0

저는 오래 전이 일을했습니다. 간단하게 C 인터페이스를 사용했습니다.

더 나은 방법이있을 수 있지만 개체에 포인터를 전달하는 것이 가장 훌륭하고 간단한 방법입니다.

+0

나는 함수에 대한 포인터도 전달해야한다. 맞습니까? 나는 객체에 대한 포인터 인 data-> events-> OnError (fn)를 전달하려고 시도했다. 여전히 링커 오류가 있습니다. – Ben

+0

아니요, 컴파일시 헤더 파일을 사용할 수 있으면 객체에 대한 포인터 만 전달하면됩니다. 나는 당신이 그 사건으로 무엇을하고 있는지에 대해 100 % 명확하지 않습니다. 확실히, 그것은 복잡하게 만들 것입니다. 그러나 포인터에서 클래스 멤버를 참조하면 링커 오류가 발생하지 않아야합니다. 그건 말이되지 않습니다. –

+0

아주 혼란 ​​스럽네요. EventRegistrar 가상 멤버를 만들면 내 문제가 사라지고 모든 것이 멋지게 작동합니다. – Ben

관련 문제