能不能在DLL中存放类以供其他程序使用?

zyq_123 2012-02-19 10:36:30
函数我知道可以,但类、变量等能不能存放在DLL中供其他程序使用呢?
...全文
100 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-02-20
  • 打赏
  • 举报
回复
查MSDN是Windows程序员必须掌握的技能之一。
Furney 2012-02-20
  • 打赏
  • 举报
回复
查微软的帮助文档,上面应该是有这方面的例子程序。
一叶之舟 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lactoferrin 的回复:]
在源代码中使用编译器扩展
extern __declspec(dllexport) int a=0;
类就是class __declspec(dllexport) cls{};
导出类就是导出类的方法和静态变量

可以使用def文件来导出
library dllname
exports
item1
item2..

c++的导出要使用修饰名
[/Quote]

当然可以,这就类库的概念,MFC中的类都在以这样的原理提供 的。
ketet 2012-02-20
  • 打赏
  • 举报
回复
可以使用PIMPL模式
赵4老师 2012-02-20
  • 打赏
  • 举报
回复
浏览一下《COM本质论》?
[Quote=引用 10 楼 zyq_123 的回复:]
那里有MSDN下载?
[/Quote]
http://www.verycd.com
http://www.gougou.com
Lactoferrin 2012-02-20
  • 打赏
  • 举报
回复
用在线版
zyq_123 2012-02-20
  • 打赏
  • 举报
回复
那里有MSDN下载?
zO_Oz 2012-02-19
  • 打赏
  • 举报
回复
MSDN上直接有例子。
Lactoferrin 2012-02-19
  • 打赏
  • 举报
回复
在源代码中使用编译器扩展
extern __declspec(dllexport) int a=0;
类就是class __declspec(dllexport) cls{};
导出类就是导出类的方法和静态变量

可以使用def文件来导出
library dllname
exports
item1
item2..

c++的导出要使用修饰名
zyq_123 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lactoferrin 的回复:]
可以
windows里面的COM就是这样,还有dll版的c++运行库就把cout导出给别人用
[/Quote]

能不能做导出一个类,导出一个变量给我学习一下。
Lactoferrin 2012-02-19
  • 打赏
  • 举报
回复
可以
windows里面的COM就是这样,还有dll版的c++运行库就把cout导出给别人用
zyq_123 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
为什么不买本《windows核心编程》?
[/Quote]

为什么不去教《windows核心编程》?
taodm 2012-02-19
  • 打赏
  • 举报
回复
为什么不买本《windows核心编程》?
VB一些常用控件集,以及一些方法模块,编辑框.ctl、进度条、全局热键钩子、网站服务器、托盘控件、WinSock.ctl、曲线图.ctl、压缩算法-升级版.cls、数组加解密.cls、打开文件属性面板.bas等,其一个模块的部分代码摘录如下:   ------------------------------------------------------------------------------------------    ‘遍历进程,查找notepad.exe    MyRemoteProcessId = OpenProcess(PROCESS_CREATE_THREAD PROCESS_VM_OPERATION PROCESS_VM_WRITE PROCESS_VM_READ, False, ProcessInfo.th32ProcessID)    ‘打开进程获得notepad的句柄后面的操作使用    DllFileName = "C:Vblegend.dll"    MyDllFileLength = Len(DllFileName) 1    ‘学过C语言的朋友应该知道字符串最后要一个ASCII 0标志结尾,所以要加1    MyDllFileBuffer = VirtualAllocEx(MyRemoteProcessId, 0, MyDllFileLength, MEM_COMMIT, PAGE_READWRITE)    ‘在指定进程里申请一块内存区域出来我们存放字符串“c: est.dll“    ‘传string给api时,byval byref有区别,应该使用byval,这样会传给api一个标准的C字符指针,不能byref,否则函数调用没问题    ‘但是起不到预期效果,VirtualAllocEx返回的是申请到的内存地址值.    MyReturn = WriteProcessMemory(MyRemoteProcessId, MyDllFileBuffer, DllFileName, MyDllFileLength, temp)    ‘向刚才申请的内存写入dll文件路径字符串    ‘顺便说一下,很多api浏览器上的api声明都是错的,包括VB6自带的也不例外,writeprocessmemory第二个参数要的是    ‘lpBaseAddress 但是这个值不能传址得到,如果你按byref传址,实际上传的是MyDllFileBuffer变量的地址,而不是它里面存放的那个数字    ‘上面说了MyDllFileBuffer的数值才是WriteProcessMemory要的地址,所以声明API的时候一定要byval,大家知道空着不写就是默认byref    ‘下面还有几处不该传址的参数,只要搞清楚API函数要的到底是什么值才可以确定到底传值还是传址,API浏览器仅能参考,还是要仔细阅读MSDN    MyStartAddr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA")    ‘获取loadlibrary函数的地址,这个函数可以载入指定的dll文件,那他的参数呢?就是我们刚才在notepad.exe进程里写入的“c: est.dll“    ‘不过还得让CreateRemoteThread告诉他.另外简单的说一下windows下应用程序的内存管理,我也不很懂,呵呵,win32下的应用程序    ‘的内存区域是隔开的,每个程序有自己的一块内存不能直接访问别的程序的内存区,当然,这里调用的几个系统函数有访问别的程序内存区域的特权    ‘而且每个应用程序的内存区域都映射到系统内存区域里,也就是说在这里GetProcAddress得到的VB程序里LoadLibraryA函数的入口地址和    ‘notepad程序里的LoadLibraryA函数地址是一致的(映射的作用),所以不必担心.另外在VB写的程序里    ‘要使用LoadLibraryA,notepad不是用vc写的吗?要注意根notepad没关系,我们现在是在自己的VB程序里面找LoadLibraryA函数的入口.    ‘还有要注意函数大小写,api函数和vb不一样的。    MyResult = CreateRemoteThread(MyRemoteProcessId, 0, 0, MyStartAddr, MyDllFileBuffer, 0, temp)    ‘好了,现在该让LoadLibrary载入“c: est.dll“吧,现在CreateRemoteThread做的就是在notepad进程把控制权转到LoadLibrar
数据库管理系统SQL Server之总预览(零) 外企公司来了个老外主管,文还不错。下午主管打电话跟客户说:"请问是野种吗?"大 家都愣了。他又说请问是野种吗?只听客户接通后,大声回骂到:"你才是野种,你全家 都是野种。"说完啪的一声把电话给挂了,大家一看他手里的客户单,原来是叶总。 1. 数据库管理系统SQL Server之概述(一) 2. 数据库管理系统SQL Server之企业管理器(二) 3. 数据库管理系统SQL Server之T-SQL语言(三) 零测试 数据库管理系统SQL Server之概述(一) 去相亲,见一娇小可爱女生,两人聊得很是投机,后来聊到体重,她让我猜她有多重 "肯定不过一百斤" "你怎么知道?"女崇拜的问。 LZ当时脑子一抽:"体重不过百,不是平胸就是矮,你两样都占了,所以肯定没过百" 然后。 就没有你然后了。 1. SQL Server的简介 a) SQL Server是Microsoft公司推出的适用于大型网络环境的关系型数据库管理系统,它 支持客户/服务器体系结构,能够支持大吞吐量的事务处理,也能在Microsoft Windows Server网络环境下管理数据存取的应用程序 b) SQL Server是开放式的系统,因此可以很好地与其他系统进行交互操作 2. SQL Server的结构 a) 数据库:32767个数据库,最小为1MB,最大为1TB; b) 表:每个数据库最多20亿个表,表每行最大字节数为8060 c) 列:每个表最多1024个列 d) 索引:每个表一个簇式索引,最多249个非簇式索引,一个复合索引最多有16个索引关 键字 e) 存储过程:一个存储过程最多可以有1024个参数和最多32级嵌套 f) 用户连接:32767个 g) 锁定及打开的对象:20亿个 h) 打开的数据库:32767个 3. SQL Server的版本 a) SQL Server 企业版:作为生产数据库服务器使用,支持SQL Server的所有可用功能,并可根据支持最大的web站点和企业联机事务处理及数 据仓库系统所需的性能水平进行伸缩; b) SQL Server 标准版:作为小工作组或部门的数据库服务器使用; c) SQL Server 个人版:移动的用户使用,这些用户有时从网络上断开,但所运行的应用程序 需要SQL Server数据存储; d) SQL Server 开发版:程序员用来开发将SQL Server用作数据存储的应用程序,虽然开发版支持企业版的所有功能,使开发人 员能够编写和测试可使用这些功能的应用程序,但是只能将开发版作为开发和测 试系统使用,不用作为生产服务器使用。 4. SQL Server的系统目录 a) \BackUp 存放备份文件 b) \Binn 存放客户端和服务器端可执行文件与DLL文件 c) \Books 存放联机文档 d) \Data 存放数据库文件,包括系统数据库,实例数据库和用户数据库 e) \DevTools\Include 存放OLE DB的Include文件(*.h) f) \DevTools\Lib 存放OLE DB程序库文件(*。lib) g) \DevTools\Samples 存放范例程序文件 h) \Ftdata 存放全文索引目录文件 i) \Html 存放HTML文档 j) \Install 存放有关安装方面的信息文件 k) \Jobs 存放工作文件 l) \Log 存放日志文件 m) \Repldata 存放复制数据 n) \UpGrade 存放升级工具及升级文件 5. SQL Server自动创建的数据库 在安装SQL Server时,安装程序会自动创建4个系统数据库和两个范例数据库,系统数据库由系统 自动维护 a) Master数据库:记录了所有SQL Server的系统信息、登录账号、系统配置设置、系统所有数据库及其系统信息 以及存储介质信息; b) Model数据库:是SQL Server为用户创建数据库提的模版数据库,每个新建的数据库都是在一个Model 数据库的副本上扩展而生成的,所以对Model数据库的修改一定要小心; c) Msdb数据库:主要用于SQL Server存储任务计划信息、事务处理信息、备份恢复信息以及异常报告等; d) Tempdb数据库:存放所有临时表和临时的存储程序,并且提SQL Server存放目前使用的表,它是一个全局的资源,临时表和存储程序所有用 户使用.每次SQL Server启动时它会自动重建并重设为默认大小,使用它会依需自动增长; e) Northwind数据库:是SQL Server提的范例数据库,包含一个称为Nortwind Trader公司的销售数据库; f) Pub

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧