如何多个应用程序共享同一个dll中的对象!

晓衡的成长日记 2008-11-26 05:16:12
例:
有两个应用分别为app1, app2, 他们都加载了同一个dll: sharelib.dll 。
在Sharelib.dll 中导出一个函数 为 function GetListObj:TList; 返回一个list对象,也就是List的指针。函数内容大概为
----------
var
g_List:TList;

function GetListObj:TList; stdcall;
begin
//没有就创建
if not Assigned(g_List) then
g_List := TList.Create;

resutl := g_List;
end;
-----------
这时app1 程序用这个dll函数GetListObj返回的List对象,使用List的add方法 ,app2程序中使用此函数得到的对应可以读取到app1中添加的内容。

如何能实现这个效果,请高手指教一下。 我看到有VC中可以使用
-------------
#pragma data_seg("Shared")
std::list <User_Info> SrvSockList;
std::list <User_Info>::iterator pSockList;
SOCKET m_Listensock=0;
HWND g_hWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")
------------
我想delphi也应该有办法的
...全文
768 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjgood 2012-09-13
  • 打赏
  • 举报
回复
学习 中....精华帖
嘶吼的蚂蚁 2012-01-13
  • 打赏
  • 举报
回复
学习下,帮顶
zhuchengchuan 2008-12-03
  • 打赏
  • 举报
回复
僵哥,你搞那么多的分,可我们分不够,想学习都没法了,我想,这有悖你上传共享的初衷吧。能不能发一份到我的邮箱:zhu19412008@163.com,谢谢。
僵哥 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 zhuchengchuan 的回复:]
僵哥,你搞那么多的分,可我们分不够,想学习都没法了,我想,这有悖你上传共享的初衷吧。能不能发一份到我的邮箱:zhu19412008@163.com,谢谢。
[/Quote]
https://forum.csdn.net/PointForum/Forum/PointExchange.aspx
  • 打赏
  • 举报
回复
unsigned 你好非常谢谢你, 你上传的资源我没有积分,下载不了。你能在QQ上发给我吗?
我的QQ号是:6346289
僵哥 2008-11-30
  • 打赏
  • 举报
回复
unit UnitManagedObject;

interface

uses
Windows
;
type
TManagedObject = class(TObject)
{Management Properties}
private
FManagementCount : Integer; //对象引用计数
public
{structor}
constructor Create;
public
{Management}
procedure Free;
function Attach:TManagedObject;
function Detach: Integer;
end;
implementation

{TManagedBaseObject}
{structor}
constructor TManagedObject.Create;
begin
Inherited Create;
FManagementCount := 1;
end;

{Management}
function TManagedObject.Attach : TManagedObject;
begin
Result := Nil;
if InterlockedIncrement(FManagementCount) = 1 then
begin
InterlockedDecrement(FManagementCount);
Exit;
end;
Result := self;
end;

function TManagedObject.Detach : Integer;
begin
Result := InterlockedDecrement(FManagementCount);
end;

procedure TManagedObject.Free;
begin
if Detach>0 then
Exit;
Inherited;
end;

end.
僵哥 2008-11-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 6346289 的回复:]
unsigned 我对dcom还是不太会用, 我想返回一个自己的对象类型怎么做了, 就如上面那个IP管理的数据结构,他是一个类。有添加删除等方法,我想的是客户端取得服务器这个对象,通过操作这个对象就能控制服务器上的数据。
我开始想,是不是要所有的类都要有一个SaveToData的方法,把这个类中的数据定义成一段连续的内存段,然后通过指针返回到客户端,客户端用LoadFromData的方法来还原。但是这样做觉得很复杂了,所有的对象都要…
[/Quote]
我写了一个示例,演示多进程共享同一个StringList,然后通过Name和Value关联,从而各进程之间通过同样的Name得到一致的Value.
http://download.csdn.net/source/824285
  • 打赏
  • 举报
回复
unsigned 我对dcom还是不太会用, 我想返回一个自己的对象类型怎么做了, 就如上面那个IP管理的数据结构,他是一个类。有添加删除等方法,我想的是客户端取得服务器这个对象,通过操作这个对象就能控制服务器上的数据。
我开始想,是不是要所有的类都要有一个SaveToData的方法,把这个类中的数据定义成一段连续的内存段,然后通过指针返回到客户端,客户端用LoadFromData的方法来还原。但是这样做觉得很复杂了,所有的对象都要这样定义。
僵哥 2008-11-27
  • 打赏
  • 举报
回复
建议使用一个中间的EXE,配置为单个实例。其它进程通过DCOM的方式与该EXE完成公用对象的访问。
Jack_Yin 2008-11-27
  • 打赏
  • 举报
回复
用内存映射文件共享Dll中的数据
具体楼主可以下载一个 <delphi 5 开发人员指南> 第九章 里面有详细介绍,还有实例,看过后保证会
Bear_hx 2008-11-27
  • 打赏
  • 举报
回复
你这种要求还是按僵哥说的,采用DCOM共享吧。
僵哥 2008-11-27
  • 打赏
  • 举报
回复
为DCOM的对象添加一个方法,然后在客户端调用该方法即可。
  • 打赏
  • 举报
回复
unsigned 我查了一下Delphi DCOM 只能操作数据库中的数据,如果能应用到程序中的数据结构中了。
比如说我现在有一种数据结构:
一个链表,装了一个结构体有两个字段:一个是SerIP,另个还是连表,这个连表里装了一个结构体里面有clientIP,计算机名
IP List
|192.168.1|list|------->|192.168.1.100|计算机1|
|192.168.2|list| |192.168.1.101|计算机2|
|192.168.3|list|

filec75 2008-11-27
  • 打赏
  • 举报
回复
友情up
僵哥 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 6346289 的回复:]
我想使用内存映射的方法似乎很解决。
我在说明一下实现的效果。
这是一个多层的框架分为:数据库(各种数据库或配置文件)、中间层业务(dll或能共享数据的东西)、界面层(可执行程序用于显示、输入、输出)

1. 界面层应用程序A运行:加载了中间层dll

2. 中间层dll读取数据库或配置文件, 生成对应的内存数据结构,用链表或树容器来管理,具有查找添加、删除、修改等操作.
dll会导出这些操作函数。

3. 界面层…
[/Quote]
搜索一下:Delphi DCOM
  • 打赏
  • 举报
回复
我想使用内存映射的方法似乎很解决。
我在说明一下实现的效果。
这是一个多层的框架分为:数据库(各种数据库或配置文件)、中间层业务(dll或能共享数据的东西)、界面层(可执行程序用于显示、输入、输出)

1. 界面层应用程序A运行:加载了中间层dll

2. 中间层dll读取数据库或配置文件, 生成对应的内存数据结构,用链表或树容器来管理,具有查找添加、删除、修改等操作.
dll会导出这些操作函数。

3. 界面层A调用dll的函数显示出对应的数据。

4. 界面层B程序,也加载dll,发现这些容器对像已经创建就不在读数据库或配置(相似一个单件模式),显示出的数据与A程序一样。

5. 程序A,修改了一个数据。 程序B先前会设置一个回调函数到dll中,dll响应一个OnDataChange事件,B程序会生新刷新界面,到dll中读取新的数据。


unsigned 你说的DCOM我不太了解,能详细点吗?能推介些资料或书籍吗?
gwhdaxia 2008-11-27
  • 打赏
  • 举报
回复
不同的进程,内存映射
laowang2 2008-11-27
  • 打赏
  • 举报
回复
upup
yc_8301 2008-11-27
  • 打赏
  • 举报
回复
顶 内存映射文件。。
#pragma data_seg("Shared")
是VC的使用方法,Delphi不能这么用。

解决方案是建立内存映射文件
或者可以使用汇编,形成obj文件,再由Delphi连接编译。
可以参照:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3088031
  • 打赏
  • 举报
回复
非常感谢Bear_hx 的代码,在你的代码中,主要是对一个TShareMem进行共享,对一个固定的内存段使用内存映射我知道,而我想实现是对N个相同结构的数据共享,这些数据是放到一个容器中,这些数据对像可能随时被创建或消毁。是不是在每次在被创建都要使用CreateFileMapping呢? 还是有很多不解!
加载更多回复(6)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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