Visual C++에서 DLL을 만들고 C++Builder에서 로드(동적으로 로드)

표제대로, VC++로 DLL 만들어 C++Builder로 읽어들일 수 있는, 가능한 한 심플한 방법의 메모.

Visual C++ 측



새로 만들기 -> 프로젝트

템플릿->Visual C++->빈 프로젝트

프로젝트 -> [프로젝트 이름] 속성

구성 속성 -> 일반 -> 프로젝트 기본값 -> 구성 유형
을 동적 라이브러리(.dll)로 변경


수업 추가


TestClass.h
class TestClass
{
public:
    TestClass();
    ~TestClass();
    int Data();
};

///C++ではなくCとして関数を作って、内部でクラスの処理を作っておく。
/// extern "C" __declspec(dllexport) 返り値 __stdcall 関数名(引数) {
/// ※__stdcallは入れておくこと。
extern "C" __declspec(dllexport) int __stdcall GetClassInstance() {
    int val;
    TestClass *test = new TestClass();
    val = test->Data();
    delete test;
    return val;
}

TestClass.cpp
#include "TestClass.h"
TestClass::TestClass()
{
}
TestClass::~TestClass()
{
}
int TestClass::Data(){
    return 255;
}

빌드 -> 솔루션 빌드로 출력

C++ Builder



적절하게 프로젝트를 만들고,
프로젝트 -> 옵션
빌드 이벤트 -> 사전 빌드 이벤트 -> 명령


TestDll.dll이라는 이름의 경우
copy /y "[VC++DLLの出力先]TestDll.dll" "$(OUTPUTDIR)TestDll.dll"

를 추가하고 C++Builder에서 빌드 전에 복사를 해 온다.

Unit.cpp
///出力にCodeSiteを使用。
void __fastcall Test(){
    HMODULE dll = LoadLibrary(L"TestDll.dll");///ファイル名
    if (dll == NULL) {
        CodeSite->Send("DLLの読み込みに失敗しました。");
        return;
    }
    typedef int (*TAddProc)();///typedef 返り値 (*関数ポインタ名)(引数);

///関数の名前はstdcallの場合
/// _関数名@引数のバイト数
///と入力する。
///分からなかったらDLLファイルをDependency Walkerというツールで読み込ませて調べられる
///http://www.dependencywalker.com
///https://msdn.microsoft.com/ja-jp/library/zxk0tw93.aspx
    FARPROC proc = GetProcAddress(dll, "_GetClassInstance@0");
    if (proc == NULL) {
        CodeSite->Send("関数のアドレスの取得に失敗しました。");
        return;
    }

    TAddProc hoge = reinterpret_cast<TAddProc>(proc);
    CodeSite->Send(hoge());
    FreeLibrary(dll);
}

참고
h tp // w w. 가자. jp / p 여과 라민 g / bcb / dl / 03. HTML

좋은 웹페이지 즐겨찾기