共享内存读出来的始终是乱码
附代码如下:
dll如下:
library exchdata;uses
  SysUtils,
  Classes,
  dialogs,
  windows;var
  hMem: THandle;{$R *.res}function getGlobalMem(): Thandle;export;
begin
    result := hMem;
end;exports
   getGlobalMem;
begin
  hMem := GlobalAlloc(gMem_Moveable and gMem_DDeshare, 4096);
  if hMem = 0 then
    showmessage('can''t alloc memory');
end.写共享内存的代码:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;  function getGlobalMem(): Thandle; far;
          external 'exchdata.dll';var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  hMem: Thandle;
  pMem: Pchar;
begin
  try
    hMem := getGlobalMem();
  except
    showmessage('无法取得共享内存的指针');
    exit;
  end;
  if hMem <> 0 then
  begin
    try
      pMem := GlobalLock(hMem);
    except
      showmessage('共享内存加锁失败');
      exit;
    end;
  end;
  if pMem <> nil then
  begin
    StrPCopy(pMem, edit1.Text);
  end;
  GlobalUnlock(hMem); 
end;
end.读共享内存的代码:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  StdCtrls, dialogs;type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end; function getGlobalMem(): Thandle; far;
          external '..\exchdata.dll';var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  hMem: Thandle;
  pMem: Pchar;
begin
  try
    hMem := getGlobalMem();
  except
    showmessage('无法取得共享内存句柄');
    exit;
  end;
  if hMem <> 0 then
  begin
    try
      pMem := GlobalLock(hMem);
    except
      showmessage('内存加锁失败');
      exit;
    end;
  end;
  if pMem <> nil then
  begin
    edit1.Text := strpas(PMem);
  end;
  GlobalUnlock(hMem);
end;end.恳请高手指点!谢谢,谢谢啦

解决方案 »

  1.   

    我知道可以用内存映射文件交换数据。但我想试一下用dll解决,多了解一种解决方法总是好事
      

  2.   

    用CreateFilemapping、MapViewOfFile、 OpenFileMapping创建dll间的内存映象文件
      

  3.   

    只有剪贴板和DDE应用采用这样使用共享内存
      

  4.   

    lxpbuaa:你最近还有写书计划吗?特别是d2005有关.net、B/S开发有关的。
      

  5.   

    原来lxpbuaa兄是高人
    请问我用的这种方式交换数据有什么缺点
      

  6.   

    用 DLL 共享内存也可以,我在 win32 中的做法是先在 dll 中划出单独一个
    段,然后在编译时设置该段为共享段(属性设为 wrs),即可。