您的位置:首页 > 其它

提供 .Net 下调用非托管Dll内部函数的快捷方法

2009-01-06 22:42 218 查看
提供 .Net 下调用非托管Dll内部函数 的快捷方法2008年12月12日 星期五 下午 10:241,用C#实现一个DllImported 类,内部利用DllImport 访问kernel32.dll的LoadLibrary和GetProcAddress

[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]

public static extern int LoadLibrary( string lpLibFileName );

[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]

public static extern IntPtr GetProcAddress(int hModule, string lpProcName);

2,利用Marshal.GetDelegateForFunctionPointer 将非托管指针转化为委托

类代码如下:

using System;

using System.Collections.Generic;

using System.Text;

///////////////添加命名空间/////////////////////////

using System.Runtime.InteropServices;

namespace DllImported

{

public class CDllImported

{

[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]

public static extern int LoadLibrary( string lpLibFileName );

[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]

public static extern IntPtr GetProcAddress(int hModule, string lpProcName);

public CDllImported()

{

}

/// <summary>

/// 获取非托管DLL内部函数

/// </summary>

/// <param name="delegateName">托管函数定义类型,用typeof(your delegate typeof)传入 </param>

/// <param name="dllName">Dll路径 </param>

/// <param name="procName">要获取的函数名称</param>

/// <returns></returns>

public object GetApi (Type delegateName, string dllName,string procName)

{

IntPtr api = GetProcAddress(LoadLibrary(dllName), procName);

return (object)Marshal.GetDelegateForFunctionPointer(api, delegateName);

}

}

}

编译产生一个DllImported的 dll组件。

在Vb里调用Api

1 先添加上面的组件

2 定义委托 Delegate Function msgDelegate(ByVal hwnd As IntPtr, ByVal strText As String, ByVal strCaption As String, ByVal type As Int32) As Int

3 实现调用

Dim api As New DllImported.CDllImported

Dim msg As msgDelegate= api.GetApi(Gettype(msgDelegate) , "user32.dll", "MessageBoxW")

msg(IntPtr.Zero, "Done", "Change", 0)

类似的可以在C#内调用,由于类代码是C#写的,调用起来很容易,此略去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐