unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
HOOK_MD5_FILENAME='3a25d2dd729b67b19463ce804c841f48';
var
  Form1: TForm1;
  lpname:PPChar;
  lp:THandle;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
  lp:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, HOOK_MD5_FILENAME);
  if lp = 0 then begin
    lp := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,256, HOOK_MD5_FILENAME);
  end;
  if lp <> 0 then
   lpname:=MapViewOfFile(lp,FILE_MAP_ALL_ACCESS,0,0,0);
   if PChar(lpname)='c:\windows\system32\cmd.exe' then
   begin
   //返回True给project2     这里该怎么把这个结果传给project2;
   end
   else
   begin
   //返回False给project2
   end;
end;end.
unit Unit2;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form2: TForm2;procedure Select_Exe;external 'apd.dll';implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
begin
Select_Exe;
end;end.library apd;uses
  windows,
  sysutils,
  Classes;const
HOOK_MD5_FILENAME='3a25d2dd729b67b19463ce804c841f48';var
  lpname:PPChar;
  lp:THandle;
  b:bool;procedure Select_Exe;Stdcall;
begin
  lp:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, HOOK_MD5_FILENAME);
  if lp = 0 then begin
    lp := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,256, HOOK_MD5_FILENAME);
  end;
  if lp <> 0 then
   lpname:=MapViewOfFile(lp,FILE_MAP_ALL_ACCESS,0,0,0);   if ExtractFileName('c:\windows\windows\cmd.exe')<>'' then
   begin
   StrCopy(PChar(lpname),'c:\windows\windows\cmd.exe');   //这里传入lpname后该怎么通知project1.exe去读取lpname;   // 这里该怎么  等project1.exe传入数据后,判断是否要删除cmd.exe;   if b then
   DeleteFile('c:\windows\system32\cmd.exe')
   else
   Exit;
   end;
end;exports Select_Exe;beginend.问题在代码注示里,请帮修改下,

解决方案 »

  1.   

    当我在project2里Select_Exe;开始执行dll里的过程,project1里的问题该如何做? dll里的该如何做?
      

  2.   

    当 Win95与 Winows Nt向内存中装载文件时,使用了特殊的全局内存区。在该区域内,应用程序的虚拟内存地址和文件中的相应位置一一对应。由于所有进程共享了一个用于存储映象文件的全局内存区域,因而当两个进程装载相同模块(应用程序或 DLL文件)时,它们实际可以在内存中共享其执行代码。笔者通过调用一个带有特殊参数的 CreateFileMapping函数,来间接达到程序间共享内存的目的。下面简要解释一下该函数。HANDLE CreateFileMapping(HANDLE hFile, //文件句柄 LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 可选安全属性DWORD flProtect, // 映象文件保护方式 DWORD dwMaximumSizeHigh, // 映象文件区域的底值 DWORD dwMaximumSizeLow, // 映象文件区域的顶值 LPCTSTR lpName // 映象文件的名字); 如果 hFile是 0xFFFFFFFF,在调用程序中必须指定 dwMaximumSizeHigh 和 dwMaximumSizeLow参数的值以确定映象文件的大小。通过这样的参数指定,该函数就创建了一个由操作系统页文件支持的特殊逻辑映象文件,而不是由实际操作系统的文件支持的逻辑映象文件。这个逻辑映象文件可以通过复制、继承或者按名字来达到共享。至于其它参数的详细说明,请参看在线帮助。在建立了映象文件之后,我们可以通过调用另外一个 API函数 MapViewOfFile来访问它的内存,该函数会返回一个指向共享内存块的特定指针。LPVOID MapViewOfFile(HANDLE hFileMappingObject, // 映象文件句柄 DWORD dwDesiredAccess, // 访问方式 DWORD dwFileOffsetHigh, // 映象文件区域的底值 DWORD dwFileOffsetLow, // 映象文件区域的顶值DWORD dwNumberOfBytesToMap // 映射字节数);如果 dwNumberOfBytesToMap 是 0,映射整个文件。以下举例说明:privatehMapFile: THandle;MapFilePointer: Pointer;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);beginhMapFile := CreateFileMapping ($FFFFFFFF, // 特殊内存映射句柄nil, page_ReadWrite, 0,10000, 'DdhDemoMappedFile'); // 文件名if hMapFile <> 0 thenMapFilePointer := MapViewOfFile (hMapFile, // 上面映象文件的句柄File_Map_All_Access, 0, 0, 0) // 访问整个映象文件elseShowMessage ('hMapFile = 0');if MapFilePointer = nil thenShowMessage ('MapFilePointer = nil');end; procedure TForm1.BtnWriteClick(Sender: TObject);beginStrCopy (PChar (MapFilePointer),PChar (EditWrite.Text));//把内容写入共享内存end; procedure TForm1.BtnReadClick(Sender: TObject);varS: string;beginS := PChar (MapFilePointer);//从共享内存读出内容EditRead.Text := S;end;用这种方法,不但可以在不同的程序之间共享数据,还可以在同一程序的不同实例间共享数据。 
      

  3.   


    给你个例子,你的问题,用DLL共享即可解决,即不同进程间共享DLL数据,注,来源于DELPHI 5开发者指南
    //dll代码
    library shareLib;
    uses ShareMem,Windows,Sysutils,Classes'
    const
      cMMFileName : Pchar = 'SharedMapData';
    {$I DLLDATA.INC} //数据结构定义
    var 
      GLobalData : PGLobalDLLData;
      MapHandle : THandle;
    procedure GetDllData(var AGlobalData : PGLobalDLLData);stdcall;
    begin
      AGlobalData := GLobalData;
    end;
    procedure OpenShareData;
      var Size : integer;
    begin
      Size := Sizeof(TGLobalDLLData);
      MapHandle := CreateFileMapping(DWord(-1),nil,PAGE_READWRITE,0,Size,cMMFileName);
      if  MapHandle = 0 then  RaiseLastWin32Error;
      GLobalData := MapVierOfFile(MapHandle,FILE_MAP_ALL_ACCESS,0,0,Size);
      GLobalData^.s := 'ShareLib';
      GLobalData^.i := 10;
      if GLobalData = nil then
      begin
        CloseHandle(MapHandle);
        RaiseLastWin32Error;
      end;
    end;    procedure CloseShareData;
    begin
      UnmapViewofFile(GLobalData);
      CloseHandle(MapHandle);
    end;procedure DllEntryPoint(dwReason : DWord);
    begin
      case dwReason of
        DLL_PROCESS_ATTACH : OpenShareData;
        DLL_PROCESS_DETACH : CloseShareData; 
      end;
    end;exports
      GetDLLData;
    begin
      DllProc := @DllEntryPoint;
      DllEntryPoint(DLL_PROCESS_ATTACH);
    end.
    //DLLDATA.INC 数据定义
    Type
      PGlobalDLLData = TGlobalDLLData;
      TGlobalDLLData = record;
        S : string[100];
        i : integer;
      end;注意是两个不同的应用
    //读取DLL数据程序
    {$I DLLDATA.INC}
    var GLobalData : PGlobalDLLData;
    procedure GetDLLData(var AGlobalData : PGlobalDLLData);stdcall External 'Sharelib.dll';//静态方式
    //定时器中读取数据
    procedure TMainform.tmTimerTimer(sender : TObject);
    begin
      GetDllData(LobalData);
    end;//写数据程序
    var GLobalData : PGlobalDLLData;
    procedure GetDLLData(var AGlobalData : PGlobalDLLData);stdcall External 'Sharelib.dll';
    //先获取数据
    GetDllData(GLobalData);
    //再写数据
    GLobalData^.s := '测试';
    GLobalData^.I := 100000;
      

  4.   

    Mark!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
      

  5.   

    楼主,程序或DLL之间的通讯,可以发送WM_COPYDATA消息来做,比较简单。
      

  6.   

    你们都是答非所问。
    要在进程间用CreateFileMapping传递数据很简单的办法是定义需要传递的数据结构
      PShareDataRec = ^TShareDataRec;
      TShareDataRec = packed record    
        LpName: array[0..255] of Char; //程序路径
         ....其它数据
      end;发送方:
       var 
          pMap:pointer;
          ShareData:PShareDataRec ;   ShareData:=PShareDataRec(MapViewOfFile(lp,FILE_MAP_ALL_ACCESS,0,0,0));
       ShareData^.LpName:='.....';//需要传的名字。接收方:
       var 
          pMap:pointer;
          ShareData:PShareDataRec ;
       ShareData:=PShareDataRec(MapViewOfFile(lp,FILE_MAP_ALL_ACCESS,0,0,0));
        ShareData^.LpName //获取
      

  7.   

    我觉得你应该用RegisterWindowMessage函数注册几个Windows消息,然后用SendMessage把消息广播出去.
    不知道行不行,但愿你的程序时有窗口的