我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: 有关DLL调用的问题 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

湘D男孩



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 473
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-09-22
最后登陆: 2008-06-29

5come5帮你背单词 [ tangible /tænd3əbl/ a. 确实的,真实的,可触摸的,有形的 ]


有关DLL调用的问题

DLL部分是已经正确生成,调用程序也没有编译,连接上的错误,就是执行(点击OK按钮)报了异常,实在对DLL调用很陌生,望热心GG指教.
void CHookTestDlg::OnOK()
{
    // TODO: Add extra validation here
    static HINSTANCE hinstDLL;
    typedef BOOL(CALLBACK*inshook)(); //function pointer
    inshook instkbhook;
   
    hinstDLL=LoadLibrary((LPCTSTR)"hodll.dll");
    instkbhook=(inshook)GetProcAddress(hinstDLL,"installhook"); //call dll's function
   
   
   
    instkbhook();// call function here
    ShowWindow(SW_MINIMIZE);
    //CDialog::OnOK();
}
顶端 Posted: 2008-04-11 13:44 | [楼 主]
路客与刀客



性别: 帅哥 状态: 该用户目前不在线
等级: 希望之光
家族: 梦魇图腾
发贴: 1980
威望: 0
浮云: 1186
在线等级:
注册时间: 2007-01-02
最后登陆: 2008-06-29

5come5帮你背单词 [ valuable /'væljuəbl/ a. 有价值的贵重的,有用的;n. (pl.)贵重物品(尤指首饰) ]


要注意判断hinstDLL或者instkbhook是否等于NULL。如果不是的话,就是DLL内部的某些语句出错了,比如越址访问,0作分母等等。
顶端 Posted: 2008-04-11 13:57 | [1 楼]
湘D男孩



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 473
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-09-22
最后登陆: 2008-06-29

5come5帮你背单词 [ solvent /'solvənt/ a. 溶解的;n. 溶剂 ]


Quote:
引用第1楼路客与刀客于2008-04-11 13:57发表的  :
要注意判断hinstDLL或者instkbhook是否等于NULL。如果不是的话,就是DLL内部的某些语句出错了,比如越址访问,0作分母等等。

可是Dll部分已经正确生成了啊...?
什么是越址访问呢?

谢谢
顶端 Posted: 2008-04-11 14:26 | [2 楼]
枫叶刀





性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1393
威望: 0
浮云: 1282
在线等级:
注册时间: 2006-03-23
最后登陆: 2009-08-14

5come5帮你背单词 [ own /əun/ a. 自己的;pron. 特有的;vt. 拥有 ]


自己调试看看在那步错!
hinstDLL=LoadLibrary((LPCTSTR)"hodll.dll");
这句为空就是路径不对,最好给绝对地址,调试时地址被改过,是项目的地址!
instkbhook=(inshook)GetProcAddress(hinstDLL,"installhook"); //call dll's function
这个"installhook"自己用dependence 看看dll有没这个是不是完全一样!注意:_    @

typedef BOOL(CALLBACK*inshook)(); //function pointer  这个要和dll保持一致
顶端 Posted: 2008-04-11 14:31 | [3 楼]
湘D男孩



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 473
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-09-22
最后登陆: 2008-06-29

5come5帮你背单词 [ scream /skri:m/ v. & n. 尖叫 ]


Quote:
引用第3楼枫叶刀于2008-04-11 14:31发表的  :
自己调试看看在那步错!
hinstDLL=LoadLibrary((LPCTSTR)"hodll.dll");
这句为空就是路径不对,最好给绝对地址,调试时地址被改过,是项目的地址!
instkbhook=(inshook)GetProcAddress(hinstDLL,"installhook"); //call dll's function
这个"installhook"自己用dependence 看看dll有没这个是不是完全一样!注意:_    @
.......

installhook函数原形是这样的:BOOL _declspec(dllexport)_stdcall  installhook();
难道定义函数指针的时候要写成:BOOL ((_declspec(dllexport)_stdcall  * inshook)()?
这样编译不过去啊?
顶端 Posted: 2008-04-11 14:57 | [4 楼]
路客与刀客



性别: 帅哥 状态: 该用户目前不在线
等级: 希望之光
家族: 梦魇图腾
发贴: 1980
威望: 0
浮云: 1186
在线等级:
注册时间: 2007-01-02
最后登陆: 2008-06-29

5come5帮你背单词 [ laundry /'lo:ndri/ n. 洗衣房(店),送洗的衣服,洗好的衣服 ]


Quote:
引用第2楼湘D男孩于2008-04-11 14:26发表的  :

可是Dll部分已经正确生成了啊...?
什么是越址访问呢?

谢谢


DLL虽然生成了,但它还没有被某一个可执行文件调用过吧,也就是说DLL内部的代码根本就没有被执行过,既然没有调用过又怎能保证DLL内部不会存在错误呢?越址访问就是访问了不应该访问的地址,操作系统为每个进行分配了属于该进程的内存空间,如果进程访问了不属于它自己的内存空间就叫越址访问。比如操作系统专gate设置了一个“陷阱”即当进程试图访问值为NULL的地址时,就会出错,这就是越址访问的典型例子。
顶端 Posted: 2008-04-11 21:49 | [5 楼]
枫叶刀





性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1393
威望: 0
浮云: 1282
在线等级:
注册时间: 2006-03-23
最后登陆: 2009-08-14

5come5帮你背单词 [ instructor /in'strΛktə/ n. 指导者,教员,教练 ]


Quote:
引用第4楼湘D男孩于2008-04-11 14:57发表的  :

installhook函数原形是这样的:BOOL _declspec(dllexport)_stdcall  installhook();
难道定义函数指针的时候要写成:BOOL ((_declspec(dllexport)_stdcall  * inshook)()?
这样编译不过去啊?

我可没说要你这样改
BOOL (_stdcall  * inshook)()这样错;
我是说你是不是函数没找到instkbhook=NULL,把调试结果写一下,大家都清楚了;
Quote:

instkbhook=(inshook)GetProcAddress(hinstDLL,"installhook");//call dll's function
这个"installhook"自己用vc自带的查看器dependence 看看dll有没这个是不是完全一样!注意:_    @
顶端 Posted: 2008-04-12 09:08 | [6 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.012676(s) query 5, Time now is:04-28 12:02, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号