Visual C++에서 DLL을 만들고 C++Builder에서 로드(동적으로 로드)
6507 단어 C++C++빌더cppBuilderVisualC++
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
Reference
이 문제에 관하여(Visual C++에서 DLL을 만들고 C++Builder에서 로드(동적으로 로드)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mm_sys/items/aa982e4c4edda41e1c62텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)