首页
社区
课程
招聘
[求助]C#中动态调用Dll的参数疑问
发表于: 2008-7-10 09:11 5666

[求助]C#中动态调用Dll的参数疑问

2008-7-10 09:11
5666

C#中要使用动态链接库中的导出函数,只能在程序中根据DllAtribute显示调用,无法在运行阶段动态加载,但是我们可以利用WIN32 API的LoadLibrary和FreeLibrary打到目的,问题是根据GetProcAddress()函数获取到的导出函数的地址无法在C#中利用,网上很多方法多是利用对函数调用栈的操作来达到在C#中操作的目的.
其实如果导出函数没有返回值,完全可以利用另一个API函数达到动态绑定DLL库的目的:
LRESULT CallWindowProc( WNDPROC lpPrevWndFunc,
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
如果导出函数无形参也无返回值的话,可以直接调用CallWindowProc(FunctionName,0,0,0,0),如果我们需要向导出函数传递简单参数的话,也可以自定义一个消息,用消息封装实参。
[DllImport("kernel32")]
public extern static int LoadLibrary(string lpLibFileName);
[DllImport("kernel32")]
public extern static bool FreeLibrary(int hLibModule);
[DllImport("kernel32", CharSet=CharSet.Ansi)]
public extern static int GetProcAddress(int hModule, string lpProcName);
[DllImport("user32", EntryPoint="CallWindowProc")]
public static extern int CallWindowProc(int lpPrevWndFunc, int hwnd, int MSG, int wParam, int lParam);

private void button1_Click(object sender, System.EventArgs e)
{
int hmod=LoadLibrary("*****.dll");
int pFname=GetProcAddress(hmod, "*****");
CallWindowProc(pFname,0,0,0);
FreeLibrary(hmod);
}

从网上看到了这么一篇文章,上面有许多地方说的很简单,不是很了解。
比如CallWindowProc(pFname,0,0,0);这个方法调用了那个Dll中的一个方法
如果这个方法是MessageBoxA(),那么方法中的参数应该怎么传进去呢?
也就是标题,内容等等…………

我试过用
int hmod=LoadLibrary("user32.dll");
int pFname=GetProcAddress(hmod, "MessageBoxA");
CallWindowProc(pFname,0,0,0);
FreeLibrary(hmod);

但是出现大是一个没有按钮,没有内容,只有一个“错误”标题的对话框。
也就是说这个方法实现了,但是没有传进去参数。

这个参数应该怎么传进去呢?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 446
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
CallWindowProc和MessageBox参数不同,不能这样调用,先申明一个MessageBoxA再调用
2008-7-10 09:24
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
能说得清楚点吗?
从哪里声明?声明后参数怎么传进去?
2008-7-10 09:40
0
雪    币: 446
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
调用一个函至少要知道这个函数的类型
搞清楚C函数指针和C#里的委托的关系先
2008-7-10 10:38
0
雪    币: 446
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
        [DllImport("kernel32")]
        public extern static IntPtr LoadLibrary(string lpLibFileName);
        [DllImport("kernel32")]
        public extern static bool FreeLibrary(IntPtr hLibModule);
        [DllImport("kernel32", CharSet = CharSet.Ansi)]
        public extern static IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

        public delegate int MessageBox(IntPtr hWnd, string text, string caption, int type);
        public static int InvokeMessageBox(IntPtr hWnd, string text, string caption, int type)
        {
            int result = -1;
            IntPtr hModule = LoadLibrary("user32.dll");
            IntPtr msgBoxPtr = GetProcAddress(hModule, "MessageBoxA");
            MessageBox fnMsgBox = Marshal.GetDelegateForFunctionPointer(msgBoxPtr, typeof(MessageBox)) as MessageBox;
            result = fnMsgBox(hWnd, text, caption, type);
            FreeLibrary(hModule);

            return result;
        }
2008-7-10 10:49
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我用的是VS2003,你说的这个方法是.net framework2.0独有的东西……
2008-7-10 11:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2003生成一个动态程序集。
2008-7-11 11:41
0
游客
登录 | 注册 方可回帖
返回
//