1

Delphi製のdllを使いたいです。次の関数があります: function CryptStr(str, Key : AnsiString; DecryptStr : boolean) : AnsiString; stdcall;

/bin/debug とアプリケーション ルートに Dll をコピーしました。私のコードは:

 [DllImport("Crypt2.dll", EntryPoint = "CryptStr", CallingConvention = CallingConvention.StdCall)]
        static extern string CryptStr( string str,  string Key, bool DecryptStr);
        public string g = "";
        private void Form1_Load(object sender, EventArgs e)
        {
          g=CryptStr("999", "999999", true);
          MessageBox.Show(g);
        }

私はいくつかの問題を抱えています:1.これらのパスからDllを削除しても、アプリケーションは見つからない例外をスローしません 実行を終了し、Messagebox 行を実行せずにフォームを表示します。Marshal を使用しようとしましたが、上記のエラーが残ります。

4

1 に答える 1

3

Delphi 以外のプログラミング環境からその関数を呼び出すことは期待できません。これは、相互運用性に有効でない Delphi ネイティブ文字列を使用しているためです。Delphi から呼び出す場合でも、DLL のコンパイルに使用したものと同じバージョンの Delphi を使用する必要がありShareMem、メモリ マネージャを共有できるようにユニットを使用する必要があります。その関数は、2 つの Delphi モジュール間の相互運用性を考慮して設計されていません。

DLL 関数の署名を変更する必要があります。たとえば、次のように使用できます。

procedure CryptStr(
    str: PAnsiChar;
    Key: PAnsiChar;
    DecryptStr: boolean;
    output: PAnsiChar;
); stdcall;

C# では、次のように宣言します。

[DllImport("Crypt2.dll")]
static extern void CryptStr(
    string str,
    string Key,
    bool DecryptStr,
    StringBuilder output
);

この変更により、呼び出し元は、関数に渡されるバッファーを割り当てる必要があります。これを行う例を見つけたい場合は、Win32 API を呼び出す例を検索してGetWindowTextください。

8 ビット ANSI の代わりに UTF-16 テキストを使用している場合はBSTR、共有 COM ヒープに割り当てられている COM を使用できますが、そのオプションは利用できないと思います。

プログラムでエラーが表示されない場合は、次の投稿を参照してください。

于 2013-10-28T10:02:50.093 に答える