Visual C++ 2017で作ったDLLをC++Builderで使う

  • 4
    いいね
  • 0
    コメント

Visual C++で作った64BitのDLLをC++Builder 10.1 Berlinで試してみました。

VC++2017側のコード

ConsoleApplication1.cpp
#include <string>

extern "C" CONSOLEAPPLICATION1_API int test1(int i1)
{
    ///This function only increments.
    ++i1;
    return i1;
}

extern "C" CONSOLEAPPLICATION1_API void test2(int i1, wchar_t* a)
{
    ///Convert from int to wstring.
    std::wstring s{};
    s = std::to_wstring(i1);
    ///It is not valid to allocate the wchar_t in the Visual C++ DLL and then free it in C++ Builder. 
    ///wchar_t *a = new wchar_t[s.length() + 1];
    wcscpy(a, s.c_str());
    ///Finally cast to wchar_t* and return.
    ///return a;
}

ビルドするとDLLが作られます。(ConsoleApplication1.dll)

C++Builder

作ったDLLをC++Builderで使ってみます。

画面デザイン

2017-03-311530.png

コード

main.cpp
#include <memory>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HMODULE _dll=LoadLibraryA("ConsoleApplication1.dll");
    if(_dll != nullptr)
    {
        FARPROC test1=GetProcAddress(_dll,"test1");
        FARPROC test2=GetProcAddress(_dll,"test2");
        using _test1 = int WINAPI (*)(int);
        using _test2 = void WINAPI (*)(int, wchar_t*);
        _test1 __inc=reinterpret_cast<_test1>(test1);
        _test2 __int_to_str=reinterpret_cast<_test2>(test2);

        std::unique_ptr<wchar_t> a{new wchar_t[4]};
        int i1      = 100;
        int i       = __inc(i1);
        __int_to_str(i, a.get()) ;

        ShowMessage(a.get());
        FreeLibrary(_dll);
    }
}

上のようにボタンイベントでLoadLibrary()しています。

結果

2017-03-311540.png

参考URL

https://community.embarcadero.com/blogs/entry/visual-c-2017-dll-c-builder-japan
https://www.embarcadero.com/jp/products/rad-studio/start-for-free