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

Posted by on in Programming

毛利です。

 

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

まずVC++2017側のコードです。

・・・・
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のコード

//---------------------------------------------------------------------------
#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);
	}
}
//---------------------------------------------------------------------------

 

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

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

「void test2(int i1, wchar_t* a)」この関数で変換した値をShowMessage()しました。

 

 



About
Gold User, No rank,
Delphi / C++Builder blogger

Comments

Check out more tips and tricks in this development video: