动态连接库全局变量的问题! ( 积分: 30 )

  • 主题发起人 主题发起人 yjlucky
  • 开始时间 开始时间
Y

yjlucky

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个动态连接库,由于里面用到全局变量,几个进程同时调用的话就会出问题,有什么办法解决?
 
我写了一个动态连接库,由于里面用到全局变量,几个进程同时调用的话就会出问题,有什么办法解决?
 
为什么要使用全局变量?
一般情况下应该使用局部变量的。
 
主要里面调用了其他一些老程序,老程序里面用的是全局变量,如果要该的话,很麻烦!
 
什么问题呀。我都不会用这个。
代码:
[blue][/blue][:D]
 
不知你所指的问题是指什么?
是不是指数据读写冲突的问题?
还是在不同的进程中各要求有不同的数据。
 
出现是问题是: 全局变量在内存中只有一份拷贝,如果另外一个进程也调用这个动态连接库的话,就会影响到上一个进程的全局变量,就象多线程中的全局变量如果每次调用都要有不同的拷贝的话,必须定义成threadvar一样
 
全局变量在内存中只有一份拷贝,如果另外一个进程也调用这个动态连接库的话,就会影响到上一个进程的全局变量。

不会呀,进程调用DLL应该不会出现你说的问题,因为进程的内存空间是独立的!
 
CreateFileMapping
MapViewOfFile
UnmapViewOfFile
用这三个函数创建全局变量,自己写了不少,不过例子现在一下子找不到
 
利用映象文件传递数据的例子:
procedure TForm1.WriteStringClick(Sender: TObject);
begin
if ExistMapFile then
hMapfile:=CreateFileMapping($FFFFFFFF, // 特殊内存映射句柄
nil,page_ReadWrite,0,10,
'DbhDemoMappedFile')
// 文件名
if hMapFile <&gt
0 then
begin
MapfilePointer:=MapviewOfFile(hMapFile, // 上面映象文件的句柄
File_Map_All_Access,
0,0,0)
// 访问整个映象文件
StrCopy(PChar(MapFilePointer),pchar(edit1.Text));//把内容写入共享内存
//s:=edit1.text
//Error!!!
//move(s,mapfilepointer^,10)
//Error!!!
edit1.SetFocus;
end
else
ShowMessage ('hMapFile = 0');
if MapFilePointer = nil then
ShowMessage ('MapFilePointer = nil');
end;

procedure TForm1.ReadStringClick(Sender: TObject);
var s:string;
begin
hMapfile:=CreateFileMapping($FFFFFFFF, // 特殊内存映射句柄
nil,page_ReadWrite,0,10,
'DbhDemoMappedFile')
// 文件名
if hMapFile <&gt
0 then
begin
MapfilePointer:=MapviewOfFile(hMapFile, // 上面映象文件的句柄
File_Map_All_Access,
0,0,0)
// 访问整个映象文件
S:= pchar(MapFilePointer);//从共享内存读出内容
edit1.Text:= S;
end
else
edit1.text:='无映象文件!';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
unmapviewoffile(mapfilepointer)
//删除不用的映像文件
closehandle(hmapfile);
end;

function ExistMapFile:boolean;
var Fhmap:integer;
begin
Fhmap:=openfilemapping(file_map_write,bool(True),'DbhDemoMappedFile');
Result:=Fhmap=0
//不存在映象文件时为0
end;

procedure TForm1.ExistMapClick(Sender: TObject);
begin
if ExistMapFile then
showmessage('映象文件不存在!');
end;
 
使用全局原子
Win32系统中,为了实现信息共享,系统维护了一张全局原子表。每个原子中存放了一些共享数据。关于对原子的操作,有一组专门的API函数:
GlobalAddAtom 在表中增加全局原子
GlobalDeleteAtom 在表中删除全局原子
GlobalFindAtom 在表中搜索全局原子
GlobalGetAtomName 从表中获取全局原子
 
我是在php中调用这个动态连接库的,发现只要同时运行多个相同的这个php网页,这个全局变量会被另外的php网页更改,有没有象 线程中 threadvar 变量一样,动态连接库中也可以定义threadvar 吗?
 
谁能搞定,再加50分
 
既然是线程同步问题,就应该用临界~~~
 
后退
顶部