C++系の記事が少なかった
社内システムでEmbarcaderoコンパイラを使用する際に公式のドキュメントやネットの記事が少なくてハマったのでメモ。
環境
- Windows 10 Enterprise x64
- Embarcadero C++ Compiler (bcc32x.exe)
コード
コードはかなり適当です。ただC++の知見が無くDLLで使用する場合のグローバル変数の扱いが分からなかったのでそのテストも含まれています。
コードの内容は、DLLを使用する側から任意のタイミングでグローバル変数を書き換える(取得する)ことを意図したものです。
#include <stdio.h>
#define DllExport __declspec( dllexport )
#ifdef __cplusplus
extern "C" {
#endif
DllExport void __stdcall Hello(){
printf("Hello!");
}
char status[50];
DllExport void __stdcall SetStatus(char* DLL_status){
memset(&status, 0, sizeof(status));
strcpy(status, DLL_status);
}
DllExport char* __stdcall GetStatus(){
return status;
}
#ifdef __cplusplus
}
#endif
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpReserved){
switch (dwReason) {
case DLL_PROCESS_ATTACH:
SetStatus((char *)"DLL_PROCESS_ATTACH");
break;
case DLL_THREAD_ATTACH:
SetStatus((char *)"DLL_THREAD_ATTACH");
break;
case DLL_THREAD_DETACH:
SetStatus((char *)"DLL_THREAD_DETACH");
break;
case DLL_PROCESS_DETACH:
SetStatus((char *)"DLL_PROCESS_DETACH");
break;
}
return TRUE;
}
ビルドコマンド
正直これを探すのが一番苦労しました。
ディレクトリ構成は以下の通り。
workspace/
├ build/
├ include/
├ lib/
└ dll_test.cpp
-tD
でLib向けにビルドできます。
-o
は出力ファイル指定オプション。
$ bcc32x -tD dll_test.cpp -o .\build\lib_dll_test.dll
includeや依存しているライブラリがある場合はこんな感じで対応できます。
$ bcc32x -tD dll_test.cpp .\include\*.cpp .\lib\* -o .\build\lib_dll_test.dll
誰かの参考になればいいですが、希少種でしょうね...。