C# マネージ DLL を使用するアンマネージ C++ DLL を作成しています。C++ ライブラリをアドオンとして追加できるソフトウェアで定義された関数とヘッダーを使用する必要があるため、C++ ライブラリを作成しています。しかし、私が作りたいものは非常に複雑で、C++ に関する知識が乏しいため、作業が遅くなるので、お気に入りの C# で作成し、DLL を COM 経由で接続することにしました。成功しました。
私は何とかコードを機能させることに成功していますが、明らかにプロの C++ プログラマーではないため、コードを簡潔に保つことにはあまり成功していません。
問題は、さまざまな文字列型の変換にあります。BSTR と const char * 特に。
次のコードは、const char * を BSTR に変換します。
BSTR bstrt;
const char * someChar;
csharpInterfacedClassPointer->get_PropertyForSomeChars(&bstrt);
strcpy_s(nstring, (char *)bstrt);
someChar = nstring;
問題は、対応する離散インターフェイス メソッドを持つ離散 someChars がたくさんあることです...プロパティ メソッドは C# インターフェイスから生成されるため、変更できません。それぞれの "someChar" には次の 3 行のコードが必要なので、30 個の離散変数の場合、90 行のコードを記述する必要があります。
csharpInterfacedClassPointer->get_PropertyForSomeCharX(&bstrt);
strcpy_s(nstring, (char *)bstrt);
someCharX = nstring;
問題は、1 行に収まるようにショートカットを作成するにはどうすればよいかということです。
「ゲッター」関数ポインターと someChar ポインターを使用して、ある種の関数を試しました。
typedef HRESULT (__stdcall *get_string_func)(BSTR * str); //getter function pointer
//the converting function
void ConvertAndAssign(get_string_func bstr_get_fx, const char * constCharString)
{
const size_t nsize = 1000;
char nstring[nsize];
BSTR bstrt;
bstrt = bstr_t(constCharString);
bstr_get_fx(&bstrt);
strcpy_s(nstring, (char *)bstrt);
constCharString = nstring;
}
//calling the function...as I thought that would work
ConvertAndAssign(sPtr->get_DataFile, someChar);
しかし、コンパイラは、バインドされた関数とそれらがポインターとして許可されていない方法についていくつかの奇妙なことを言います...私はそれが何を意味し、与えられた解決策は関数定義を変更するために必要でしたが、定義が生成されているのでそれを行うことはできませんC# コードから (regasm.exe による)。
重要な注意:最後に const char * 型を取得する必要があります。これは、C++ DLL を作成しているプログラムの関数に必要な入力型であるためです。