DLLImport'ed / P / Invoke'd win32 dll中的自定义类型?

时间:2009-05-07 10:30:05

标签: .net winapi pinvoke types dllimport

下午好,

我目前正在与一个旧的.dll进行摔跤。我必须在.Net应用程序中重复使用这个功能。我到目前为止导入了返回bool等的基本/简单函数/方法,但实际上有些人还希望(或返回)在.dll中声明的类型。

我该如何处理?我如何在我的.net环境中映射/创建该类型?这有可能吗?

干杯谢谢, -Jörg

3 个答案:

答案 0 :(得分:1)

通过“type”,我假设你的意思是结构,否则你将不得不找出如何将内存中的结构映射到你的类型。

您必须在.NET应用程序中创建相同的结构,并使用StructLayout属性标记它(LayoutKind.Sequential是最常见的)。然后你应该能够传递对结构的引用。

Platform Invoke Tutorial on MSDN也非常有帮助。

答案 1 :(得分:0)

我的理解是,您通常会在.NET代码中创建一个结构,该结构使用一些[StructLayout]选项(顺序或显式)镜像预期的数据布局 - 并将该结构传递给PInvoke边界(即在导入的API上。)

答案 2 :(得分: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...
}