请教怎么来实现 "内存映像文件"

wrw001 2006-04-11 11:25:13
大虾们帮忙呀 我想把一个图像在两个独立内存的程序中传递 一个是主程序 一个是DLL 查了资料说

"
在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份,但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据传递,除非你用内存映像文件。

"

有两种办法可以实现 但是:

保存成文件再传送 我觉得慢
用剪切板传送 感觉方法不是很好

请教了
...全文
213 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoshi0 2006-05-11
  • 打赏
  • 举报
回复
直接CreateFileMapping就可以了
pp616 2006-05-11
  • 打赏
  • 举报
回复
不需要用CreateFile
直接
Handle hMap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,大小,映射名称);
zyyoung 2006-05-11
  • 打赏
  • 举报
回复
友情up
wbf420 2006-04-17
  • 打赏
  • 举报
回复
调顺序调用这三个函数,具体的写法查一下帮助就行了!
CreateFile()
CreateFileMapping()
MapViewOfFile()
happyct 2006-04-17
  • 打赏
  • 举报
回复
懒得写,抄一段给你

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
butUpperCase: TButton;
butLowerCase: TButton;
memTextContents: TMemo;
procedure butUpperCaseClick(Sender: TObject);
procedure butLowerCaseClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ChangeFileCase;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
UCase: Boolean;
FName: string;

implementation

{$R *.dfm}

procedure TForm1.butUpperCaseClick(Sender: TObject);
begin
UCase := True;
ChangeFileCase;
end;

procedure TForm1.butLowerCaseClick(Sender: TObject);
begin
UCase := false;
ChangeFileCase;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FName := 'c:\boot.ini';
memTextContents.Lines.LoadFromFile(FName);
UCase := true;
end;

procedure TForm1.ChangeFileCase;
var
FFileHandle:THandle;
FMapHandle:THandle;
FFileSize:integer;
FData:PByte;
PData:PChar;
begin
if not FileExists(FName) then
raise Exception.Create('File does not exist.')
else
FFileHandle := FileOpen(FName,fmOpenReadWrite);
if FFileHandle = INVALID_HANDLE_VALUE then
raise Exception.Create('Failed to open or creatr file.');

try
FFileSize := GetFileSize(FFileHandle,Nil);
FMapHandle := CreateFileMapping(FFileHandle,nil,PAGE_READWRITE,0,FFileSize,nil);
finally
CloseHandle(FFileHandle);
end;

try
FData := MapViewOfFile(FMapHandle,FILE_MAP_ALL_ACCESS,0,0,FFileSize);
if FData = Nil then
raise Exception.Create('Failed to map view of file');
finally
CloseHandle(FMapHandle);
end;

try
PData := PChar(FData);
inc(PData,FFileSize);
PData^ := #0;
if UCase then
StrUpper(PChar(FData))
else
StrLower(PChar(FData));
finally
UnmapViewOfFile(FData);
end;

memTextContents.Lines.Clear;
memTextContents.Lines.LoadFromFile(FName);
end;

end.
wrw001 2006-04-17
  • 打赏
  • 举报
回复
顶一下
wrw001 2006-04-12
  • 打赏
  • 举报
回复
不太清楚怎么搞呀,麻烦那位大虾指点.....
netsys2 2006-04-11
  • 打赏
  • 举报
回复
还可以有共享内存和SOCKET通信

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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