文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» C/C++ » 关于#import "Ole.dll" named_guids       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: 关于#import "Ole.dll" named_guids  ( 查看:470  回复:9 )   
 
bone3360
技术员  点击可查看详细



十二生肖之狗   水瓶座   行业勋章   技术勋章   诚信兄弟  
帖子 84
精华 0
无忧币 186
积分 202
阅读权限 30
来自 (保密)
注册日期 2006-11-10
最后登录 2008-8-30 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-1-28 09:59   标题:关于#import "Ole.dll" named_guids
上一帖 |
如题,请教高手帮忙解释下!



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-1-28 09:591楼
[ 顶部 ]
 
bone3360
技术员  点击可查看详细



十二生肖之狗   水瓶座   行业勋章   技术勋章   诚信兄弟  
帖子 84
精华 0
无忧币 186
积分 202
阅读权限 30
来自 (保密)
注册日期 2006-11-10
最后登录 2008-8-30 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-1-28 10:10 
编译提示错误:
fatal   error   C1083:   Cannot   open   type   library   file:   'Ole.dll':   加载类型库/DLL   时出错。
我的OLE.dll就在根目录下。



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-1-28 10:102楼
[ 顶部 ]
 
hagejid
副版主  点击可查看详细


十二生肖之猴   金牛座   行业勋章   技术勋章   诚信兄弟  
帖子 405
精华 0
无忧币 2004
积分 491
阅读权限 140
注册日期 2007-4-3
最后登录 2008-9-7 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-1-28 12:57 
如果是运行程序出问题的话,把它放到运行程序所在的目录或SYSTEM32目录看看.
如果是编译出问题,先看看有没有加到工程里边了...



C到底该不该学,看看这个就明白
2008-1-28 12:573楼
[ 顶部 ]
 
bone3360
技术员  点击可查看详细



十二生肖之狗   水瓶座   行业勋章   技术勋章   诚信兄弟  
帖子 84
精华 0
无忧币 186
积分 202
阅读权限 30
来自 (保密)
注册日期 2006-11-10
最后登录 2008-8-30 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-1-28 13:37 
编译不通过。我有在project->setting中的link选项的Object/library moudles中加上ole.dll这个。但是就是通不过。
有人说缺少lib文件,缺少的是哪个lib文件呢?



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-1-28 13:374楼
[ 顶部 ]
 
ribut9225
主版主  点击可查看详细


开坛元老   内阁大臣   诚信兄弟   主版主专用   巨蟹座  
帖子 3069
精华 1
无忧币 5692
积分 4079
阅读权限 150
来自 (保密)
注册日期 2006-6-22
最后登录 2008-9-8 离线

[查看资料]  [发短消息]  [Blog
  QQ       
发表于:2008-1-29 09:10 
dll文件不能这样写的,如果没有lib文件,应该是在程序里动态调用:
LoadLibrary 、FreeLibrary

如果有lib文件在,那么就可以静态调用了,在工程里直接设置附加项



用户必读,51CTO积分系统调整通知
2008-1-29 09:105楼
[ 顶部 ]
 
bone3360
技术员  点击可查看详细



十二生肖之狗   水瓶座   行业勋章   技术勋章   诚信兄弟  
帖子 84
精华 0
无忧币 186
积分 202
阅读权限 30
来自 (保密)
注册日期 2006-11-10
最后登录 2008-8-30 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-1-29 14:08 
谢谢ribut9225。动态调用还不会。只能以后慢慢来了。现在要找个应急的方法。



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-1-29 14:086楼
[ 顶部 ]
 
ribut9225
主版主  点击可查看详细


开坛元老   内阁大臣   诚信兄弟   主版主专用   巨蟹座  
帖子 3069
精华 1
无忧币 5692
积分 4079
阅读权限 150
来自 (保密)
注册日期 2006-6-22
最后登录 2008-9-8 离线

[查看资料]  [发短消息]  [Blog
  QQ       
发表于:2008-1-30 08:51 
那就是去找lib文件
将lib文件加入工程中



用户必读,51CTO积分系统调整通知
2008-1-30 08:517楼
[ 顶部 ]
 
ribut9225
主版主  点击可查看详细


开坛元老   内阁大臣   诚信兄弟   主版主专用   巨蟹座  
帖子 3069
精华 1
无忧币 5692
积分 4079
阅读权限 150
来自 (保密)
注册日期 2006-6-22
最后登录 2008-9-8 离线

[查看资料]  [发短消息]  [Blog
  QQ       
发表于:2008-1-30 08:57   标题:回复 #2 bone3360 的帖子

VC中隐式链接无.LIB动态链接库的方法
该文章转载自网络大本营:http://www.xrss.cn/Dev/C/200741612454.Html

由于我们经常要调用一些第三方厂商或其他编译器编写的动态链接库,但是一般都不提供源文件或.lib文件,而作为VC隐式链接到DLL (implicitly link to the DLL)调用,这些却是必需的。本文将主要讨论在没有源文件及.lib输入库文件或欲调用 Windows未公开函数的情况下重建.Lib文件的方法。在建立之前,我们首先要了解一下DLL输出函数的几种方式。
一、从DLL中输出函数的方式(calling conventions )
_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。
_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。
_fastcall方式的函数采用寄存器传递参数,VC将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数。
用VC建立一个空的动态链接库,并加入以下三个文件:
//noname.h  动态链接库头文件
extern "C" void _stdcall  stdcallproc(void);
extern "C" void  _cdecl cdeclproc(void);
extern "C" void  _fastcall fastcallproc(void);
//noname.cpp   动态链接库实现文件
#include <windows.h>
extern "C" void _stdcall  stdcallproc(void)
{MessageBox(0,"stdcall function","dll call",0);
}
extern "C" void  _cdecl cdeclproc(void)
{MessageBox(0,"cdecl function ","dll call",0);
}
extern "C" void  _fastcall fastcallproc(void)
{MessageBox(0,"fastcall function ","dll call",0);
}
//noname.def  动态链接库输出函数定义
LIBRARY      "noname"
EXPORTS
stdcallproc @1 noname
cdeclproc  @2
fastcallproc @3
编译后生成noname.lib,输出函数_cdeclproc,_stdcallproc@0,
@fastcallproc@0;生成的noname.dll在Exescope等PE格式的工具中只能看到cdeclproc和fastcallproc函数,因为stdcallproc被指定noname属性,没有名字输出,类似于Windows未公开函数。
二、可执行程序调用DLL的方式
    可执行程序可以采用隐式链接(implicit linking)或显式链接(explicit linking)两种方式调用一个DLL。
使用显式链接时,使用DLL的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用 GetProcAddress函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary),因为不是本文重点,具体例程请参考有关文档。显然,在调用大量的函数时这种方法会很不方便。
使用隐式链接时,可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。
三、重建.Lib输入库文件
根据微软的建议,要想隐式地链接到一个DLL,可执行程序必须从DLL的提供者那儿得到一个包含输出函数的头文件(.h文件)、一个用于链接的输入库(.lib文件)。愿望是很好的,但是一般情况下,我们都无法得到第三方动态链接库的输入库文件,或者我们需要调用Windows未公开函数。如果你是使用Delphi或Visual Basic开发程序,那么,你只要简单的申明一下函数和输出库就可以了。但是,使用VC的朋友们只好重建.Lib文件了。
1.删掉第一步中生成的noname.lib(假设我们没有这个文件)。
2.用微软的DumpBin.exe:dumpbin /exports noname.dll>noname.def,留下noname.def文件的输出段:
    ordinal hint RVA      name
          2    0 00001005 cdeclproc
          3    1 0000100F fastcallproc
          1      0000100A [NONAME]
修改为:
LIBRARY      "noname"
EXPORTS
cdeclproc    @2
fastcallproc @3
nonameproc   @1 //请注意与第一步中noname.def的区别:nonameproc可以自己指定为任何名字
再执行 lib.exe /def:noname.def即可生成noname.lib文件(但如果这个动态链接库不仅仅包含_cdecl类型函数,那么这个noname.lib还不是最终可用的.lib文件,具体请看下文)。
3.建立一个名为DllCaller的Win32控制台程序,将刚才生成的noname.dll和noname.lib拷入DllCaller\debug目录。
//DllCaller.cpp
//声明函数原型
extern "C" void _stdcall  nonameproc(void);
extern "C" void  _cdecl cdeclproc(void);
extern "C" void  _fastcall fastcallproc(void);
//链接输入库文件
#pragma comment( lib, "debug\oname.lib" )
int main(int argc, char* argv[])
{
    nonameproc();
    cdeclproc();
    fastcallproc();
    return 0;
}
编译器产生如下错误:
DllCaller.obj : error LNK2001: unresolved external symbol @fastcallproc@0
DllCaller.obj : error LNK2001: unresolved external symbol _nonameproc@0
根据错误提示信息将noname.def更改如下:
@fastcallproc@0 @3
nonameproc@0 @1
重新生成noname.lib,即可重新编译DllCaller.exe。
四、调用Windows未公开函数
根据以上分析,下面给出一个简单的调用Window98系统Shell32.DLL中序号为60的未公开函数,执行后将出现重新启动的对话框。
//shell32.def ,据此生成Shell32.LIB
LIBRARY      "shell32"
EXPORTS
SHShutDownDialog@4 @60
// DllCaller.cpp : 调用未公开函数的控制台程序
//函数声明
extern "C" long  _stdcall SHShutDownDialog(long lShutdown);
//链接输入库文件
#pragma comment( lib, "debug\\shell32.lib" )
int main(int argc, char* argv[])
{
   SHShutDownDialog(0);
return 0;
}



该文章转载自网络大本营:http://www.xrss.cn/Dev/C/200741612454.Html



用户必读,51CTO积分系统调整通知
2008-1-30 08:578楼
[ 顶部 ]
 
ribut9225
主版主  点击可查看详细


开坛元老   内阁大臣   诚信兄弟   主版主专用   巨蟹座  
帖子 3069
精华 1
无忧币 5692
积分 4079
阅读权限 150
来自 (保密)
注册日期 2006-6-22
最后登录 2008-9-8 离线

[查看资料]  [发短消息]  [Blog
  QQ       
发表于:2008-1-30 08:59 
在VC中链接动态链接库的方法简要说明
本文详细介绍在VC中链接动态链接库的方法简要说明
方法一:windows提供了一套函数,用于加载动态链接库中的符号(函数和变量),调用这些函数去加载:

  1. HINSTANCE LoadLibrary( LPCTSTR lpLibFileName);

  2. FARPROC GetProcAddress( HMODULE hModule, LPCWSTR lpProcName);

  3. BOOL FreeLibrary( HMODULE hLibModule);

  这最直观的一种方法,同时也是最麻烦的一种办法。

  方法二:让调用者的工程依赖于动态链接库工程。步骤如下:

  1. 让调用者的工程处于active状态下。

  2. 打依赖设置对话框:Project-->dependencies。

  3. 选择动态链接库工程。

  这种方法比较方便,但要求有DLL的项目文件。

  方法三:直接把动态链接库产生的.lib文件加入到调用者的工程中。

  方法四:进入Link设置:Project-->settings-->Link,选择Categery中的Input,在object/library modules里输入的动态链接库对应的.lib文件名,在Additional library path中输入动态链接库对应的.lib的路径。

  方法五:#pragma (lib, "filename.lilb")



用户必读,51CTO积分系统调整通知
2008-1-30 08:599楼
[ 顶部 ]
 
bone3360
技术员  点击可查看详细



十二生肖之狗   水瓶座   行业勋章   技术勋章   诚信兄弟  
帖子 84
精华 0
无忧币 186
积分 202
阅读权限 30
来自 (保密)
注册日期 2006-11-10
最后登录 2008-8-30 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-1-30 09:59 
谢谢。好详细,好好学习下!



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-1-30 09:5910楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号