2016-09-26 20 views
0

私は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); 

答えて

0

で関数を呼び出し、私は通常、Cの名前と私のC++関数をエクスポートします。 C++の名前を使用しているので、関数名ではなく序数でdllimportを試みることをお勧めします。 何か

[DllImport("CDLL.dll", EntryPoint="#25")] 

のようなアイブ氏はまたあなたの関数名は、あなたのDLLIMPORTで試合をいけないことに気づきました。あなたのCで ++あなたは、「コードの取得」それを呼び出すが、DLLIMPORTにyouveは「UTB_GetCode」と呼ん あなたがしたい場合は、確かに名前を変更することはできますが、そうあなたのdllのimport文

+0

にエントリポイントを定義する必要があります、UTBの部分がここに書き換え中にエラーになりました – motoDrizzt

関連する問題