2009-05-07 9 views
1

こんにちは、DLLImport'ed/P/Invoke'd win32 dllの/とのカスタムタイプ?

は、私は現在、私はブール値などを返す基本/簡単な関数/メソッドをインポートするために、これまで来たの.Netアプリケーション&内を再利用していた機能古い.dllファイルと格闘しています実際には.dll内で宣言されている型も期待している(または返す)人もいます。

どうすれば対応できますか?どのようにマップ/私の.net環境でそのタイプを作成するでしょうか?それはまったく可能ですか?

乾杯と感謝、 -Jörg

答えて

1

"タイプ"とは、構造体を意味すると見なします。そうでなければ、メモリ内の構造体を自分のタイプにマップする方法を見つける必要があります。

.NETアプリケーションで同じ構造体を作成し、StructLayout属性(LayoutKind.Sequentialが最も一般的です)でマークする必要があります。次に、構造体への参照を渡すことができるはずです。

Platform Invoke Tutorial on MSDNも非常に役に立ちます。

0

私の理解では、あなたが一般的に(順次または明示的な)[StructLayout]いくつかのオプションを使用して、期待されるデータレイアウトを反映.NETコードで構造体を作成するだろうということです - とその構造体をPInvoke境界(つまり、インポートされたAPI)に渡します。

0

これがあなたが望むものなのかどうかわかりませんが、私はそれを撮影します!

私のアプリケーション(ASP.NET)でdelphi dllを使用していて、ラッパーを作成しなければなりませんでしたが、winformsの場合、ラッパーDLLを作成する必要はありませんが、そのDLLから2つのメソッドを貼り付け、どのように呼び出すのですか?

#region DllImport 

    [DllImport("LicenseInterface.dll", CallingConvention = CallingConvention.StdCall, 
       CharSet = CharSet.Auto, EntryPoint = "EncodeString")] 
    private static extern int _EncodeString(
     [MarshalAs(UnmanagedType.LPStr)] string secret, 
     [MarshalAs(UnmanagedType.LPWStr)] string str, 
     [MarshalAs(UnmanagedType.LPWStr)] StringBuilder encodedStr, 
     int encodedBufferSize); 

    [DllImport("LicenseInterface.dll", CallingConvention = CallingConvention.StdCall, 
       CharSet = CharSet.Auto, EntryPoint = "DecodeString")] 
    private static extern int _DecodeString(
     [MarshalAs(UnmanagedType.LPStr)] string secret, 
     [MarshalAs(UnmanagedType.LPWStr)] string str, 
     [MarshalAs(UnmanagedType.LPWStr)] StringBuilder decodedStr, 
     int decodedBufferSize); 

    #endregion 


    public static int EncodeString(string str, ref string encodedStr) 
    { 
     StringBuilder _encodedString = new StringBuilder(2000); 
     int ret = _EncodeString("aYs6aL9b8722XXe43", str, _encodedString, _encodedString.Capacity); 
     encodedStr = _encodedString.ToString(); 
     return ret; 
    } 

    public static int DecodeString(string str, ref string decodedStr) 
    { 
     StringBuilder _decodedString = new StringBuilder(2000); 
     int ret = _DecodeString("aYs6aL9b8722XXe43", str, _decodedString, _decodedString.Capacity); 
     decodedStr = _decodedString.ToString(); 
     return ret; 
    } 

public License() 
{ 
    // code... 
    License.DecodeKey(moduleKey, ref serial, ref moduleId, ref expirationDate, ref userData); 
    // more code... 
}