C ++의 DLL에서 함수 호출
-
22-08-2019 - |
문제
2008 년에 2 개의 프로젝트가있는 솔루션이 있습니다. 하나는 C ++로 작성된 DLL이고 다른 하나는 빈 프로젝트에서 만든 간단한 C ++ 콘솔 응용 프로그램입니다. 응용 프로그램에서 DLL의 함수를 호출하는 방법을 알고 싶습니다.
공백 C ++ 프로젝트로 시작하고 있으며 int IsolatedFunction(int someParam)
어떻게 부르나요?
해결책
이 작업을 수행하는 방법에는 여러 가지가 있지만 가장 쉬운 옵션 중 하나는 링크 시간에 응용 프로그램을 DLL에 연결 한 다음 A를 사용하는 것입니다. 정의 파일 DLL에서 내보낼 기호를 정의합니다.
경고: 정의 파일 접근 방식이 가장 잘 작동합니다 미색 기호 이름. 장식 된 기호를 내보내려면 아마도 더 낫습니다. 사용하지 않습니다 정의 파일 접근법.
다음은 이것이 어떻게 수행되는지에 대한 간단한 예입니다.
1 단계: 에서 함수를 정의하십시오 수출 .H 파일.
int WINAPI IsolatedFunction(const char *title, const char *test);
2 단계: 에서 함수를 정의하십시오 Export.cpp 파일.
#include <windows.h>
int WINAPI IsolatedFunction(const char *title, const char *test)
{
MessageBox(0, title, test, MB_OK);
return 1;
}
3 단계 : : 기능을 내보내기로 정의하십시오 Export.def 정의 파일.
EXPORTS IsolatedFunction @1
Step 4: DLL 프로젝트를 만들고 추가하십시오 Export.cpp 그리고 Export.def 이 프로젝트에 파일. 이 프로젝트를 구축하면 Export.dll 그리고 Export.lib 파일.
다음 두 단계는 링크 시간에 DLL에 연결됩니다. 링크 시간에 진입 점을 정의하지 않으려면 다음 두 단계를 무시하고 loadlibrary 그리고 GetProcaddress 런타임에 기능 입력 점을로드합니다.
Step 5: a 테스트 응용 프로그램 프로젝트를 추가하여 DLL을 사용합니다 Export.lib 프로젝트에 파일. 복사 Export.dll THS와 같은 위치에 파일 테스트 콘솔 실행 파일.
6 단계 : 를 불러 격리 기능 아래 그림과 같이 테스트 응용 프로그램 내에서 기능.
#include "stdafx.h"
// get the function prototype of the imported function
#include "../export/export.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// call the imported function found in the dll
int result = IsolatedFunction("hello", "world");
return 0;
}
다른 팁
또한 DLL에서 기능을 내보내고 EXE에서 가져올 수 있습니다. 처음에는 더 까다 롭지 만 결국 LoadLibrary/getProcaddress를 호출하는 것보다 훨씬 쉽습니다. 보다 MSDN.
VS 마법사로 프로젝트를 만들 때 DLL에는 기능을 내보내는 확인란이 있습니다.
그런 다음 EXE 애플리케이션에서는 적절한 정의가있는 DLL의 헤더를 #IN을 포함시키고 DLL 프로젝트를 EXE 애플리케이션에 종속성으로 추가하면됩니다.
이 점을 더 조사하려면이 다른 질문을 확인하십시오. dllexport를 사용하여 DLL에서 함수를 내보내십시오.
하퍼가 그의 대답에 언급 된 바와 같이, 여기에 대한 링크가 있습니다. MSDN 샘플 링크 링크 연결 링크 다시) 또는 콘솔 애플리케이션이 DLL 프로젝트에서 생성 된 .lib에 연결하고 ( 로드 타임 동적 연결 MSDN 샘플)
두 경우 모두 DLL이 제대로 호출하려는 기능을 내보내야합니다. 가장 쉬운 방법은 함수 선언에 __declspec (dllexport)를 사용하는 것입니다 (생성에 표시된대로 간단한 동적 링크 라이브러리 MSDN 샘플), DLL 프로젝트의 해당 .DEF 파일을 통해도 수행 할 수 있습니다.
DLL의 주제에 대한 자세한 내용은 동적 링크 라이브러리에 대한 MSDN 주제.
다음은 필요한 5 단계입니다.
- 함수 포인터를 선언합니다
- 라이브러리를로드하십시오
- 절차 주소를 가져옵니다
- 기능 포인터에 할당하십시오
- 함수 포인터를 사용하여 함수를 호출하십시오
단계별 VC ++ IDE 스크린 샷을 찾을 수 있습니다. http://www.softwareandfinance.com/visual_cpp/dlldynamicbinding.html
코드 스 니펫은 다음과 같습니다.
int main()
{
/***
__declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding
***/
typedef bool (*GW)(char *buf, int len);
HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL"));
GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage");
char buf[128];
if(GetWelcomeMessage(buf, 128) == true)
std::cout << buf;
return 0;
}
DLL의 동적 런타임로드에 대해 이야기하고 있다고 가정하면 Loadlibrary 및 GetProaddress를 찾고 있습니다. 예제가 있습니다 MSDN.
DLL이 생성되면 가져 오기 LIB가 일반적으로 자동으로 생성되며 헤더 파일과 함께 프로그램에 링크 된 해당 사용을 호출해야하지만 그렇지 않으면 Windows 기능을 수동으로 호출 할 수 있습니다. loadlibrary 그리고 GetProcaddress 작동하기 위해.