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