문제

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 단계입니다.

  1. 함수 포인터를 선언합니다
  2. 라이브러리를로드하십시오
  3. 절차 주소를 가져옵니다
  4. 기능 포인터에 할당하십시오
  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 작동하기 위해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top