0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C++ EmbarcaderoコンパイラでDLLを作成する

Posted at

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

誰かの参考になればいいですが、希少種でしょうね...。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?