Shared Memory Win32共享内存,几十M都可以
unit SharedMemory;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type  TfisSharedMemory = class(TComponent)
  private
    { Private declarations }
    FShareName: String;
    FSize: integer;
    FHandle, FMutex: THandle;
    FReadOnly: boolean;
    FTimeout: integer;  protected
      procedure SetName(const aValue: TComponentName );override;
    { Protected declarations }
  public
      constructor Create(AOwner: TComponent);override;
      destructor Destroy;override;
      function MemoryExist: boolean;
      function MapMemory: pointer;    { Public declarations }
      function UnMapMemory(aMapPtr: pointer):boolean;
      function CreateMemory: boolean;
      function CloseMemory: boolean;
      function OpenMemory: boolean;
      function RequestOwnership: boolean;
      function ReleaseOwnership: boolean;
      property Handle: THandle read FHandle;
      property Mutex: THandle read FMutex;  published
    { Published declarations }
      property ReadOnly: boolean read FReadOnly write FReadOnly default false;
      property ShareName: String read FShareName write FShareName;
      property Size: integer read FSize write FSize;
      property Timeout: integer read FTimeout write FTimeout default -1;  end;  const
    MUTEX_NAME = '_SMMutex';procedure Register;implementationprocedure TfisSharedMemory.SetName(const aValue: TComponentName );
var
    lChange: boolean;
begin
    lChange := (csDesigning in ComponentState) and
        ((Name = FShareName) or (Length(FShareName) = 0));
    inherited;
    if lChange then
    begin
        FShareName := Name;
    end;
end;
//---------------------------------------------------------------------------
function TfisSharedMemory.MapMemory:pointer;
var
    lMapping: DWord;
begin
    if FHandle = 0 then
    begin
      Result := nil;
      exit;
    end;    if(FReadOnly)then
    begin
        lMapping := FILE_MAP_READ;
    end
    else
    begin
        lMapping := File_Map_All_Access;
    end;
    Result := MapViewOfFile(FHandle, lMapping, 0, 0, FSize);
    if(Result = nil)then
    begin
        ReleaseMutex(FMutex);
    end;
end;
//---------------------------------------------------------------------------
function TfisSharedMemory.UnMapMemory(aMapPtr: pointer): boolean;
begin
    if FHandle <> 0 then
    begin
        UnmapViewOfFile(aMapPtr);
        result := true;
    end
    else
    begin
        result := false;
    end;
end;
//---------------------------------------------------------------------------
function TfisSharedMemory.CreateMemory: boolean;
var
    lMutexName: string;
begin
    Result := true;
    if FHandle <> 0 then CreateMemory := false;
    FHandle := CreateFileMapping(THANDLE($FFFFFFFF), nil, PAGE_READWRITE, 0,
        FSize, pchar(FShareName));
    if (FHandle = 0) or ((FHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
    begin
        CloseMemory;
        Result := false;
    end;
    lMutexName := FShareName + MUTEX_NAME;
    FMutex := CreateMutex(nil, false, pchar(lMutexName));
    if(FMutex = 0) then
    begin
        CloseMemory;
        Result := false;
    end;
end;
//---------------------------------------------------------------------------
function TfisSharedMemory.CloseMemory: boolean;
begin
    if(FHandle <> 0) then
    begin
        CloseHandle(FHandle);
        FHandle := 0;
    end;
    if(FMutex <> 0) then
    begin
        CloseHandle(FMutex);
        FMutex := 0;
    end;
    Result := true;
end;
//---------------------------------------------------------------------------
function TfisSharedMemory.OpenMemory: boolean;
var
    lMutexName: string;
begin
    Result := false;
    if(FHandle = 0) then
    begin
        FHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, true, pchar(FShareName));
        if(FHandle <> 0) then
        begin
            lMutexName := FShareName + MUTEX_NAME;
            FMutex := OpenMutex(MUTEX_ALL_ACCESS, true, pchar(lMutexName));
            if(FMutex <> 0 ) then
            begin
                Result := true;
            end
            else
            begin
                CloseMemory;
            end;
        end;
    end;
end;
//---------------------------------------------------------------------------
function TfisSharedMemory.RequestOwnership: boolean;
var
    lTimeout: DWord;
begin
    Result := false;
    if(FHandle <> 0) then
    begin
        if(FTimeout < 0) then
        begin
            lTimeout := INFINITE;
        end
        else
        begin
            lTimeout := FTimeout;
        end;
        Result := WaitForSingleObject(FMutex, lTimeout) = WAIT_OBJECT_0;
    end;
end;
//---------------------------------------------------------------------------
function TfisSharedMemory.ReleaseOwnership: boolean;
begin
    Result := false;
    if(FHandle <> 0) then
    begin
        Result := ReleaseMutex(FMutex);
    end;
end;
//---------------------------------------------------------------------------
constructor TfisSharedMemory.Create(AOwner: TComponent);
begin
    inherited;
    FShareName := '';
    FTimeout := -1;
    FSize := 0;
    FReadOnly := false;
    FHandle := 0;
    FMutex := 0;
end;
//---------------------------------------------------------------------------
destructor TfisSharedMemory.Destroy;
begin
    CloseMemory;
    inherited;
end;
//---------------------------------------------------------------------------
procedure Register;
begin
  RegisterComponents('FISH', [TfisSharedMemory]);
end;
//---------------------------------------------------------------------------
function TfisSharedMemory.MemoryExist: boolean;
var PVHandle:THandle;
begin
  Result := false;
  PVHandle := CreateFileMapping(THANDLE($FFFFFFFF), nil, PAGE_READWRITE, 0,
        FSize, pchar(FShareName));
  if (PVHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)
     then Result:=true
     else CloseHandle(PVHandle);
end;end.

解决方案 »

  1.   

    兄弟,看了看你也没跳出openmutex创建互斥对象的圈子,求其它解法
      

  2.   

    另外,我是要与VC、VB的应用程序互调,大家有经验吗?共享一下?
      

  3.   

    看看这个消息:WM_COPYDATA,级别那么高Sendmessage和PostMessage应该会吧!
      

  4.   

    谢谢关注,但不知道不要乱说,Dll是进程内运行的;套接字是指Socket吗?我同机运行的两个程序用TCP通讯,有点好笑吧?
      

  5.   

    我觉得用套接字并不好笑,不过这是UNIX下常用的方式,就是绑定一个端口,进行数据的接收
      

  6.   

    netlib(河外孤星):最好给个例子看看
      

  7.   

    如果这两个程序都是你做的,可以用自动化呀,可以传递很多的字符串,
    你可看看《delphi com深入编程》自动化那一章要.
      

  8.   

    或者我把源程序给你看一看。
    发邮件给我或留言给我。
    [email protected]
      

  9.   

    方法很多的
    1,利用剪贴板
    2,利用WM_COPYDATA消息;
    3,使用全局原子;
    4, 使用映象文件;
      

  10.   

    代码呢?什么wm_copydata、全局原子、内存映射听的太多了,来段实际的代码吧。
      

  11.   

    to progray(千重劫)
    写出来你给分吗?!呵呵
      

  12.   

    还是用WM_COPYDATA保险,因为在2000/NT/XP下已经不支持共享内存段了.