怎么多个应用程序共享同一个dll中的对象
如何多个应用程序共享同一个dll中的对象!
例:
有两个应用分别为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也应该有办法的
------解决方案--------------------
用内存映射,下面是我写的一段代码给你参考。
例:
有两个应用分别为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也应该有办法的
------解决方案--------------------
用内存映射,下面是我写的一段代码给你参考。
- Delphi(Pascal) code
{****************************************************************************} { } { SharedMem.pas { Comment:真正的实现了服务和应用程序共享内存 { } {****************************************************************************} unit MsgSharedMem; interface uses Windows, Messages, SysUtils, Math; const CSharedMemSize = 1024*1024*3; CSharedMemName = 'Global\FleetReportSharedMemorty'; WM_CreateReport = WM_USER + 1001; WM_EndReport = WM_USER + 1002; CSocketEndTag = #13#10; type //报表执行状态 TReportState = (rsFinished, rsInexistent, rsWaiting, rsRunning, rsException, rsCanceled); TShareMem = record Handle: THandle; ReportID: Integer; ReportState: TReportState; ReportType: Integer; StatFile: array[0..1024*1024] of Char; TestConfig: array[0..1024*1024] of Char; MapFile: array[0..1024*100] of Char; SiteData: array[0..1024*100] of Char; DestFile: array[0..1024*2] of Char; HintMsg: array[0..1024*3] of Char; end; PShareMem = ^TShareMem; TPublicVars = class private FShareMem: PShareMem; FMapFile: THandle; procedure SetHandle(AValue: THandle); function GetHandle: THandle; procedure SetReportID(AValue: Integer); function GetReportID: Integer; procedure SetReportState(AValue: TReportState); function GetReportState: TReportState; procedure SetReportType(AValue: Integer); function GetReportType: Integer; procedure SetStatFile(AValue: string); function GetStatFile: string; procedure SetTestConfig(AValue: string); function GetTestConfig: string; procedure SetMapFile(AValue: string); function GetMapFile: string; procedure SetSiteData(AValue: string); function GetSiteData: string; procedure SetDestFile(AValue: string); function GetDestFile: string; procedure SetHintMsg(AValue: string); function GetHintMsg: string; public constructor Create(ANew: Boolean); destructor Destroy; override; property Memory: PShareMem read FShareMem; property Handle: THandle read GetHandle write SetHandle; property ReportID: Integer read GetReportID write SetReportID; property ReportState: TReportState read GetReportState write SetReportState; property ReportType: Integer read GetReportType write SetReportType; property StatFile: string read GetStatFile write SetStatFile; property TestConfig: string read GetTestConfig write SetTestConfig; property MapFile: string read GetMapFile write SetMapFile; property SiteData: string read GetSiteData write SetSiteData; property DestFile: string read GetDestFile write SetDestFile; property HintMsg: string read GetHintMsg write SetHintMsg; end; implementation { TPublicVars } resourcestring CouldNotMapViewOfFile = 'Could not map view of file.'; const SECURITY_NULL_SID_AUTHORITY = 0; SECURITY_WORLD_SID_AUTHORITY = 1; SECURITY_LOCAL_SID_AUTHORITY = 2; SECURITY_CREATOR_SID_AUTHORITY = 3; SECURITY_NT_AUTHORITY = 5; SECURITY_NULL_RID = 0; SECURITY_WORLD_RID = 0; SECURITY_LOCAL_RID = 0; SECURITY_CREATOR_OWNER_RID = 0; SECURITY_CREATOR_GROUP_RID = 1; ACL_REVISION = 2; type ACL_SIZE_INFORMATION = record AceCount: DWORD; AclBytesInUse: DWORD; AclBytesFree: DWORD; end; ACE_HEADER = record AceType: BYTE; AceFlags: BYTE; AceSize: WORD; end; PACE_HEADER = ^ACE_HEADER; ACCESS_ALLOWED_ACE = record Header: ACE_HEADER; Mask: ACCESS_MASK; SidStart: DWORD; end; constructor TPublicVars.Create(ANew: Boolean); var SecMem: SECURITY_ATTRIBUTES; aSD: SECURITY_DESCRIPTOR; begin inherited Create; { 创建一个任何用户都可以访问的内核对象访问权 } InitializeSecurityDescriptor(@aSD, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@aSD, True, nil, False); SecMem.nLength := SizeOf(SECURITY_ATTRIBUTES); SecMem.lpSecurityDescriptor := @aSD; SecMem.bInheritHandle := False; FMapFile := CreateFileMapping($FFFFFFFF, @SecMem, PAGE_READWRITE, 0, CSharedMemSize, CSharedMemName); FMapFile := OpenFileMapping(File_Map_All_Access, False, CSharedMemName); if (FMapFile = 0) then begin raise Exception.Create(SysErrorMessage(GetLastError)); OutputDebugString(PChar(SysErrorMessage(GetLastError))); end else begin // 成功 FShareMem := MapViewOfFile(FMapFile, File_Map_All_Access, 0, 0, CSharedMemSize); OutputDebugString(PChar(SysErrorMessage(GetLastError) + ',Handle=' + IntToStr(Handle))); end; end;