300分请教高手dll的高级应用问题

xiaosun 2003-04-25 04:45:05
一个程序,可以动态的加载动态连接库,写动态连接库的人可以给你一个文本来描述动态连接库的名 函数原型,注意是文本的,所以你的程序里不知道对方会给你一个什么样的函数、函数有几个参数,要求能够调用他的程序,假设参数是window标志的,没有用户自定义的类型。

我已经实现了一半,就差函数参数的处理了
谢谢
...全文
26 37 打赏 收藏 举报
写回复
37 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
webber84 2003-04-27
你可以先写一个正常的函数调用,让编译器给你生成汇编代码,看看编译器是怎么把参数压栈的,其实直接把编译器生成的汇编代码拷到你的源程序中就行了。
  • 打赏
  • 举报
回复
功名半纸 2003-04-26
利用C++的类成员函数指针和模版好像有可能做的到!!!!


回去试试!!!!
  • 打赏
  • 举报
回复
xiaosun 2003-04-26
得到的参数总是不太对,
还有,c或者c++有没有这样的功能封装?
  • 打赏
  • 举报
回复
xiaosun 2003-04-26
但是我在传递数组的时候出现了问题
  • 打赏
  • 举报
回复
weijiechen 2003-04-26
up
  • 打赏
  • 举报
回复
o_racle 2003-04-26
我的程序不用有任何变化

-------------------------
有相似之处
  • 打赏
  • 举报
回复
webber84 2003-04-26
把你写的代码贴出来看看吧。
  • 打赏
  • 举报
回复
seeQe 2003-04-26
学习
  • 打赏
  • 举报
回复
xiaosun 2003-04-26
webber84(***闭关修炼中***)  :
谢谢你,这不是我遇到的问题,我是想将参数放到数组,然后循环压栈,因为dll的函数中的参数个数可能是不同的类型,所以我要用一个variant 数组来存放收到到参数变量,然后压栈。

不知道你是否明白了我的意思。
  • 打赏
  • 举报
回复
webber84 2003-04-26
不知道你说的是什么问题,我试了一下是可以传数组的。

这个是用来测试的DLL导出函数定义,__cdecl调用方式:
__declspec(dllexport) void print(int* array,int size)
{
for(int i=0;i<size;i++)
cout<<array[i]<<endl;
}
下面是调用代码:
HMODULE hMod=LoadLibrary("dll.dll");
PROC pfn=GetProcAddress(hMod,"print");
int array[5]={1,2,3,4,5};
int ** address=(int**)&array;
__asm
{
push 5;
push address;//注意这里不能直接把数组名压到栈里,不知道你遇到的是不是这个问题
call pfn;
add esp,8; //如果导出函数是__stdcall的,这个就不要了。
}
经测试一切正常。
  • 打赏
  • 举报
回复
xiaosun 2003-04-26
force_eagle(战鹰) :能够再给的具体一点吗

类的成员函数指针我知道 ->*
但是如何用模板来包装?谢谢提供思路
  • 打赏
  • 举报
回复
xiaosun 2003-04-25
希望大家多发表想法,谢谢
  • 打赏
  • 举报
回复
webber84 2003-04-25
有意思,回去做做看。
  • 打赏
  • 举报
回复
xiaosun 2003-04-25
必需动态连接,显式调用
  • 打赏
  • 举报
回复
xiaosun 2003-04-25
不行,我要写的是一个可以动态加载并运行指定dll的程序,但是我事先不知道dll中的函数原型,写dll的人要做的只是用文本将dll中要调用的函数类型告诉我就可以了。而我的程序不用有任何变化
  • 打赏
  • 举报
回复
COOL099 2003-04-25
靜態鏈接不行嗎?
你可以根據DLL文件獲得Lib導入庫
要用到DumpBin.exe /exports xxx.dll>xxx.def
修改為常見的def 文件。
再用lib .exe /def:xxx.def 生成xxx.lib .
接下來就不用說了吧。
  • 打赏
  • 举报
回复
everandforever 2003-04-25
大概是的。
  • 打赏
  • 举报
回复
xiaosun 2003-04-25
噢,我明白了,谢谢你。
对于数组怎么处理,push的时候只写数组的地址(也就是数组名)就可以?
  • 打赏
  • 举报
回复
xiaosun 2003-04-25
everandforever(Forever) :你有msn吗?我们通过msn来交流好吗?谢谢
  • 打赏
  • 举报
回复
everandforever 2003-04-25
CDECL 是由调用者负责清理栈的,所以要最后一句。别的方法,不知道。
  • 打赏
  • 举报
回复
加载更多回复(17)
发帖
进程/线程/DLL

1.5w+

社区成员

VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
帖子事件
创建了帖子
2003-04-25 04:45
社区公告
暂无公告