私はC#のC++ DLLを使用しています。すべては、文字列ポインタを入力してデータを入力する関数とは別に、うまく動作します。私は、DLLのソースコードを持っており、前述の関数のコードはこれです:C#のDLLでC++コードを呼び出して文字列を返す
int CDLL::GetCode(char *CodeN)
{
int year, cn, sn1;
year = m_dwCode >> 24;
year += 2000;
sn = (m_dwCode >> 8) & (0xFFFF);
sn1 = m_dwCode & (0xFF);
if (sn1 != 0) {
sprintf(CodeN, "%d-%d-%d", year, cn, sn1);
}
else {
sprintf(CodeN, "%d-%d", year, sn);
}
return 1;
}
自体はこれでエクスポートされる関数は:
_declspec(dllexport) int WINAPI GetCode(char *sn)
{
return ((CDLL*)AfxGetApp())->GetCode(sn);
};
私は数でそれをインポートしようとしましたいろいろな方法がありますが、うまくいかないようです。私はいつも予想されるコードの代わりにガーベッジを取り戻す。
これは私が試した最後のインポートです:
[DllImport("CDLL.dll", CallingConvention = CallingConvention.Winapi)]
internal extern static int GetCode([param: MarshalAs(UnmanagedType.LPTStr), Out()] StringBuilder sn);
そしてこれは、呼び出し元のコードです:
StringBuilder myCode = new StringBuilder("xxxx-yyyyy-zzz");
Wrapper.GetCode(myCode);
return myCode.ToString();
しかし、私はいつも文字列にゴミ、およびAで終わる私が期待するよりも長い文字列。誰かがそれを頼む前に
注:DLLがOK取り組んでいるが、VB.Netソフトウェアの年間使用されている、と私は完全に動作する環境での開発/テストです。
ちょうど完全にするために、VBのコードは (文字列としてByVal SC) として、それを宣言し、C#ので使用するための
Dim tempCode As String
tempCode = "xxxx-yyyyy-zzz";
GetCode(tempCode);
にエントリポイントを定義する必要があります、UTBの部分がここに書き換え中にエラーになりました – motoDrizzt