社区
进程/线程/DLL
帖子详情
如何动态导入DLL中的类
happy1123
2008-01-21 12:33:25
我需要使用LoadLibrary来导入DLL,并使用DLL中的类。不知道怎么做。请高手指点。
...全文
831
5
打赏
收藏
如何动态导入DLL中的类
我需要使用LoadLibrary来导入DLL,并使用DLL中的类。不知道怎么做。请高手指点。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
stivenjia
2008-01-21
打赏
举报
回复
例如:
DWORD CreateA(A *lp)
{
lp = new A;
return 0;
}
之后你导出该类并调用它。
或者你使用类似COM的做法。
使用地址表
北方大冬瓜
2008-01-21
打赏
举报
回复
LoadLibrary("文件名")返回得到的模块句柄,可以加载一个动态连接库或exe文件。
GetProcAddress(Hinstance,lpname)用来获取指定的动态连接库函数的地址
Hinstance为由LoadLibrary返回的模块句柄,lpname为文件名/函数名,返回值,成功返回动态连接库的地址,失败返回NULL,
FreeLibrary(Hinstance),Hinstance为由LoadLibrary返回的模块句柄,功能是:释放动态连接库!
动态引入方式就是使用Windows的两个API即LoadLibrary和GetProcAddress,前者用于获得DLL的句柄,后者用于获得DLL中例程的地址,这种方式之所以被称为动态的,是因为它不需要在程序的开始处把要引入的例程全部列出,只要在调用前引入,并且LoadLibrary可以指定不同的DLL,GetProcAddress可以指定不同的例程,最重要的是如果指定的DLL出错,最多是API调用失败,但不会导致程序终止,因此我们应该在程序中监视DLL的返回值,根据返回值作出相应的处理。程序示例如下:
Var LibHandel:Thandlel;
LibHandle:=LoadLibrary(Pchar(DLLname));
以上首先声明一个DLL的句柄,然后用LoadLibrary获得DLL的句柄,其中DLLName是DLL的文件名,由于LoadLibrary是Windows的API,因此调用时要强制转换成Pchar类型。
Var Getcount:Function(Index:integer):Integer;StdCall;
@Getcount:=GetProcAddress(LibHandle,’’GetCount’’);
以上声明了一个例程指针,指向一个函数,有一个Integer类型的参数,返回类型也是Integer,调用约定是StdCall方式,然后用GetProcAddress获得DLL中GetCount例程的地址。
Var MyCount:Integer;
MyCount:=GetCount(1);
以上是调用DLL中例程GetCount的例子。
DLL只能输出例程,虽然DLL中也含有变量(全局变量),但程序不能直接引入这些变量,只能通过接口例程间接地访问这些变量。DLL也不能直接访问调用DLL的程序中的变量。
注意,不管那种方式,在编译期,编译器不检查DLL是否存在以及要引入的例程是否存在等问题,因此这类错误在编译期是检查不出来的。
进程调用 LoadLibrary(或 AfxLoadLibrary)以显式链接到 DLL。如果成功,函数将指定的 DLL 映射到调用进程的地址空间中并返回此 DLL 的句柄,该句柄可与用于显式链接的其他函数(如 GetProcAddress 和 FreeLibrary)一起使用。
LoadLibrary
LoadLibrary 尝试使用用于隐式链接的同一搜索序列来定位 DLL。如果系统无法找到 DLL 或者入口点函数返回 FALSE,LoadLibrary 将返回 NULL。如果对 LoadLibrary 的调用所指定的 DLL 模块已映射到调用进程的地址空间中,则函数仅返回 DLL 的句柄并递增模块的引用数。
如果 DLL 有入口点函数,则操作系统在调用 LoadLibrary 的进程上下文中调用此函数。如果由于以前调用了 LoadLibrary 但没有相应地调用 FreeLibrary 函数而导致 DLL 已经附加到进程,则不会调用此入口点函数。
加载扩展 DLL 的 MFC 应用程序应使用 AfxLoadLibrary 而不是 LoadLibrary。AfxLoadLibrary 在调用 LoadLibrary 之前处理线程同步。AfxLoadLibrary 的接口(函数原型)与 LoadLibrary 相同。
如果出于某种原因 Windows 无法加载 DLL,进程可以尝试从错误恢复。例如,进程可通知用户所发生的错误,并让用户指定 DLL 的其他路径。
安全说明 如果代码将在 Windows NT 4 或 Windows 2000 上运行,请务必要指定任何 DLL 的完整路径名。
ouyh12345
2008-01-21
打赏
举报
回复
不能动态加载
happy1123
2008-01-21
打赏
举报
回复
也就是说,肯定不能用loadlibrary加载类了?
jameshooo
2008-01-21
打赏
举报
回复
导出类只可用于隐式加载,不能使用LoadLibrary进行显示加载
itextsharp.
dll
5.4.4
最新iTextSharp的
dll
,同时带有
dll
的源代码,以及简单的demo。将excel文件
导入
datagridview,将datagridview导出为pdf。
Maticsoft.DBUtility.
dll
动软
在使用动软提供的DPHELPER时,必须提前
导入
这个
类
。
duilib
动态
链接库及
导入
库
duilib所需要的
dll
与lib,不会手动生成lib库的这里下载
DLL
动态
链接库的
导入
导出
Dll
中
包含若干公用的代码、数据等,可供其他模块(
DLL
或exe文件等)使用。
Dll
中
并不是所有的函数都必须供其他模块使用,只有经过 导出(export) 后才允许被外部正常调用。
动态
库的由来:
Dll
最初用于节约应用程序所...
动态
加载调用
DLL
里的
类
DLL
中
的函数可以很容易的实现
动态
加载调用,网上也有很多相关的介绍,但
DLL
中
类
库怎样实现
动态
加载调用呢? 这是我在实际项目
中
遇到的一个问题,可以采用
类
工厂方法,把对象的指针导出来的方法解决这
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章