여기에 문제가 있습니다. 헤더 파일 내부의 C++ DLL에서 메서드를 링크 및 정의하는 방법을 모르겠습니다. Code :: Blocks에 어떻게 링크합니까? 또한 헤더 파일 내부에서 메서드를 정의하려면 어떻게해야합니까? 나는 이것이 바보 같은 질문 인 것처럼 느낀다. 그러나 나는 그것을 온라인 어디에서도 발견 할 수 없다.Code :: Blocks에서 헤더 파일로 DLL에 액세스하기
0
A
답변
0
MinGW로 인해 Windows를 의미한다고 가정하면 그렇게 나쁘지 않습니다. 예를 들어, "someDllFunction"라는 "theDLL.dll"의 기능은 double
를 받아 발췌있을 가능성이있는 int
을 반환 : 당신은 더 일반적인 발신자를 작성하여 더욱이 걸릴 수
//dllfunctions.h
int someDllFoo(double d) {
auto dll = LoadLibraryW(L"theDLL");
if (!dll) {
//error
}
using FooType = int(*)(double);
auto func = (FooType)GetProcAddress(dll, "someDllFunction");
if (!func) {
//error
}
int result = func(d);
if (!FreeLibrary(dll)) {
//error
}
return result;
}
//whatever.cpp
#include "dllfunctions.h"
int main() {
int result = someDllFoo(3.2);
}
합니다. 이 결과를 할당하기 때문에 다음은, 리턴 타입이 void 작동하지 않습니다,하지만 추가 가능한입니다 : 이 작업, 또는 적어도 올바른 궤도에 있어야
template<typename Ret, typename... Args>
Ret callDllFunction(const std::wstring &dllName, const std::string &funcName, Args... args) {
auto dll = LoadLibraryW(dllName.c_str());
if (!dll) {
//error
}
using FuncType = Ret(*)(Args...);
auto func = (FuncType)GetProcAddress(dll, funcName.c_str());
if (!func) {
//error
}
Ret result = func(args...);
if (!FreeLibrary(dll)) {
//error
}
return result;
}
int main() {
//tested example
callDllFunction<int>(L"user32", "MessageBoxW", nullptr, nullptr, nullptr, 0);
}
있다. 물론, 내가 말했듯이, 당신이 그것의 다른 버전을 추가 할 때까지 void 리턴 타입에는 작동하지 않는다. __stdcall 함수로 확장 할 수도 있습니다. 또한 DLL의 오류 함수를 처리 할 수 있도록 오류 메커니즘을 설정하는 것이 좋습니다. SetLastError
을 사용하는 경우 FreeLibrary
호출로 재정의 될 수 있습니다. 정말로 당신이해야 할 일이 무엇인지에 달려 있습니다. 함수가 끝나면 FreeLibrary
을 호출하는 스마트 포인터에 dll
을 넣는 것도 고려해 볼 수 있습니다.
관련 문제
- 1. Visual Studio로 DLL에 액세스하기
- 2. Code :: blocks에서 디버깅
- 3. Code :: blocks에서 magick ++ stuff 컴파일
- 4. Code :: Blocks에서 GLUT 프로젝트 만들기
- 5. Code :: Blocks에서 C를 개발 하시겠습니까?
- 6. 헤더 부분에서 컨트롤러에 액세스하기
- 7. Code :: Blocks에서 확장 된 Ascii 문자 C++
- 8. Code :: Blocks에서 컴파일러를 프로젝트 단위로 설정
- 9. Code :: Blocks에서 wmain() 엔트리 포인트를 어떻게 사용합니까?
- 10. Code :: Blocks에서 SFML 설정시 문제가 발생했습니다.
- 11. Code :: blocks에서 Boost를 사용하는 데 문제가 있습니다.
- 12. Code :: Blocks에서 main 메소드를 변경 하시겠습니까?
- 13. Code :: Blocks에서 C++ 프로그램이 실행되지 않습니다.
- 14. Code :: Blocks에서 C++ 컴파일러를 찾을 수 없습니다.
- 15. Visual C++ 코드가 Code :: Blocks에서 작동하지 않습니다.
- 16. Code :: Blocks에서 이미지를 컴파일하고 링크하는 방법
- 17. Code :: Blocks에서 SSE/SSE2를 활성화하는 방법은 무엇입니까?
- 18. Code : Blocks에서 --enable-shared 또는 -fPIC 적용
- 19. Code :: Blocks에서 디스 어셈블리를 보는 방법?
- 20. 왜 Code :: Blocks에서 mingw와 함께 컴파일되지 않습니까?
- 21. Code :: Blocks에서 정적 시스템 라이브러리 libm.a를 연결하십시오.
- 22. Code :: Blocks에서 디버그 할 수 없습니다.
- 23. 헤더 파일로 새 프로젝트 시작하기
- 24. Code :: Blocks에서 만든 실행 파일을 Ubuntu에서 어떻게 실행할 수 있습니까?
- 25. Code :: Blocks에서 동적 라이브러리에 정적 라이브러리를 바인딩하는 방법
- 26. Code :: Blocks에서 프로그램을 실행하기위한 추가 명령 줄 인수?
- 27. Code :: Blocks에서 경고 또는 오류없이 컴파일되지 않는 프로젝트
- 28. 어떻게 code :: blocks에서 하나의 프로젝트를 만들 수 있습니까?
- 29. 기존 Makefile을 사용하여 Code :: Blocks에서 프로젝트를 빌드 할 수 있습니까?
- 30. Code :: Blocks에서 C++ 비 클래스 멤버 컴파일 오류가 발생 했습니까?
나는 오해하고 있는가, 아니면'LoadLibrary'와'GetProcAddress' 종류의 것을 의미합니까? – chris
잘 모르겠습니다. 나는 DLL을로드 할 수 있기를 원하며, MinGW를 사용하여 헤더 내부에서이를 수행하는 방법을 모른다. – user2348979
헤더 밖에서 또는 MinGW없이 어떻게하는지 알고 계십니까? – chris