私はC#を学んでいて、その経験があります。小さなプロジェクトでは、C#アプリケーションにC++のDLLを実装する必要があります。これは、ライセンスプレート認識sdkです。私はそれを初期化することができますので、このC + +コードを呼び出す作業です。しかし、私は文字列を含むC++コードから構造体を受け取るのに問題があります。私はたくさん試しましたが、ここでたくさん読んでいますが、うまく動作しません。構造体をC++のDLLからC#アプリケーションに変換する
[DllImport("D:\\processor.dll", EntryPoint = "StartALPR", CallingConvention = CallingConvention.Cdecl)]
[return:MarshalAs(UnmanagedType.LPStruct)]
public static extern TMyData StartALPR(TImageSource tImageSource);
C#の構造体のTMyData:これは、C#側で
[StructLayout(LayoutKind.Sequential)]
public struct TMyData
{
[MarshalAs(UnmanagedType.LPTStr)]
public string PlateString;
[MarshalAs(UnmanagedType.LPTStr)]
public string PlateXML;
[MarshalAs(UnmanagedType.LPTStr)]
public string LastError;
};
そして、これは我々が分析する画像へのファイルパスの文字列が含まれているtImageSourceを送信するために呼び出すメソッドです。
alprResult = StartALPR(tImageSource);
ファイルが解析されているため、動作しています。私はVS2015の出力にプレートの文字列を見ることができます。 しかし、私は構造体 "alprResult"がTMydataで定義されていると期待していますが、メソッドの符号がpinvoke符号と互換性がないという例外があります。私が持っている唯一の情報は、C++でこのdll/codeを使用する方法の例です。これは、C++コードです:私はC#でこれを使用するにはどうすればよい
struct TMyData;
typedef TMyData *PMyData;
struct TMyData
{
/**
PlateString: Best license plate number of the plate group
*/
const char * PlateString;
/**
PlateXML: Plate group data in standard XML string
*/
const char * PlateXML;
/**
LastError: Laast config error ex: bad file extensions .. Default: empty
*/
const char * LastError;
};
:
TImageSource SImageSource;
TMyData *pd;
/* Set input image */
SImageSource.MyImageFile = AnsiString(CarImage).c_str();
Memo1->Lines->Clear();
/* Starting plate detect and recognition */
pd = StartALPR(&SImageSource);
/* Standard XML result, the plate datas with numbers and positions */
Memo1->Lines->Add(pd->PlateXML);
/* last error message */
Memo2->Lines->Add(pd->LastError);
/* Best characters on plate */
Edit1->Text = pd->PlateString;
これは、同じ例からC++構造体ですか? ありがとうございます。
私は@πάνταῥεῖ –
ことをやったあなたにチャック・ノリスをありがとうございます。私は別の方法でそれを解決した、それはポインタを返していた。 – Denniss