請問是否可將 PROJECT1.EXE 的 DataSet 給 PROJECT2.EXE 使用 |
尚未結案
|
ufjjc
一般會員 發表:18 回覆:47 積分:23 註冊:2002-05-21 發送簡訊給我 |
|
Amanda_Chen
一般會員 發表:25 回覆:82 積分:21 註冊:2003-12-28 發送簡訊給我 |
|
ufjjc
一般會員 發表:18 回覆:47 積分:23 註冊:2002-05-21 發送簡訊給我 |
謝謝回應
不過 兩個 PROJECT 是不同的 EXE , 而不是同一 EXE,不同的 UNIT . 之前的 的寫法 如下
procedure TForm1.Button1Click(Sender: TObject);
type
PInteger = ^Integer;
var
Px,Py: PInteger;
ps : string; begin
//----------------------------------------------------------
// 將指標轉為字串 ,再將字串 轉為 指標
Px := ADDR( DataSource1.DataSet);
ps := intTOSTR(PX^); Py := ptr( STRTOINT(PS) );
DBDataSet1.DataSet := Pointer(py);
end
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
ufjjc
一般會員 發表:18 回覆:47 積分:23 註冊:2002-05-21 發送簡訊給我 |
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
ufjjc大大,您好!
打擾您一下,看看這個idea,看能否對您解決問題有所幫助: 通過使用映射文件在不同的>記憶體映射文件>
主要將使用以下幾個> >
②打開映射文件:<> >
③映射到本進程中:<> >
④關閉映射文件:<> >
具體 class="code">
unit Unit1; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls; const
WM_DATA = WM_USER 1024;
type
PShareMem = ^TShareMem;
TShareMem = record
Data: array[0..255] of char;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations } end; var
Form1: TForm1;
PShare: PShareMem;
implementation {$R *.DFM}
var
HMapping: THandle;
HMapMutex: THandle;
const
MAPFILESIZE = 1000;
REQUEST_TIMEOUT = 1000; procedure OpenMap;
begin
{創建一個文件映射內核對象}
HMapping := CreateFileMapping(
$FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(TShareMem),
{這個文件映射物件的名字用於與其他進程共用該物件,}
pchar('Map Name')
);
if (hMapping = 0) then
begin
ShowMessage('不能創建記憶體映射文件');
Application.Terminate;
exit;
end;
{將文件資料映射到進程的位址空間}
{當創建了一個文件映射物件之後,仍然必須讓系統爲文件的資料保留
一個位址空間區域,並將文件的資料作爲映射到該區域的物理記憶體進行提交。
}
PShare := PShareMem(MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0));
if PShare = nil then
begin
CloseHandle(HMapping);
ShowMessage('Can''t View Memory Map');
Application.Terminate;
exit;
end; {既然我們通過pvFile得到了映象視圖的起始地址,那麽可以對視圖做一些操作了}
end; procedure CloseMap;
begin
if PShare <> nil then
{從進程的位址空間中撤銷文件資料的映象}
UnMapViewOfFile(PShare);
if HMapping <> 0 then
CloseHandle(HMapping);
end; function LockMap: Boolean;
begin
Result := true;
{創建互斥物件}
HMapMutex := CreateMutex(nil, false,
pchar('MY MUTEX NAME GOES HERE'));
if HMapMutex = 0 then
begin
ShowMessage('不能創建互斥物件');
Result := false;
end else begin
if WaitForSingleObject(HMapMutex, REQUEST_TIMEOUT)
= WAIT_FAILED then
begin
ShowMessage('不能對互斥物件加鎖!');
Result := false;
end
end
end; procedure UnlockMap;
begin
{關閉文件映射物件和文件物件}
ReleaseMutex(HMapMutex);
CloseHandle(HMapMutex);
end; procedure TForm1.Button1Click(Sender: TObject);
var
str: pchar;
begin
str := pchar('簡單的共用記憶體的例子');
CopyMemory(@(pShare^.data), Str, Length(str));
{發送消息表明有資料}
PostMessage(FindWindow(nil, 'MyForm'), WM_DATA, 1, 1)
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
UnlockMap;
CloseMap;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
OpenMap;
LockMap;
end; end.
將Project2的caption='Myform',用於發送資料端的程式找到本程式,並通知本程式有關的消息
Project2的code如下
unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const WM_DATA = WM_USER 1024; type PShareMem = ^TShareMem; TShareMem = record Data: array[0..255] of char; end; TMyForm = class(TForm) Memo1: TMemo; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure getShareInfo(var Msg: TMessage); message WM_DATA; {處理WM_DATA} end; var MyForm: TMyForm; PShare: PShareMem; MapHandle: THandle; implementation {$R *.DFM} procedure TMyForm.getShareInfo(var Msg: TMessage); {處理WM_DATA} begin if msg.LParam=1 then {是我們設定的消息參數} Memo1.Text := PShare^.Data; end; procedure TMyForm.FormCreate(Sender: TObject); begin MapHandle := OpenFileMapping(FILE_MAP_WRITE, {獲取完全訪問映射文件} False, {不可繼承的} pchar('Map Name')); {映射檔案名字} if MapHandle = 0 then begin ShowMessage('不能定位記憶體映射文件塊!'); Halt; end; PShare := PShareMem(MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0)); if PShare = nil then begin CloseHandle(MapHandle); ShowMessage('Can''t View Memory Map'); Application.Terminate; exit; end; FillChar(PShare^, SizeOf(TShareMem), 0); end; procedure TMyForm.Button1Click(Sender: TObject); begin CloseHandle(MapHandle); close; end; end.先運行Project1,再運行Project2,然後單擊Project1的發送資料,就可以在Project2看到接受到的資料. 我也是一知半解,如有谬误,请多多指教! < class="code"> =============== 人生在勤,不索何获? =============== 發表人 - bigdogchina 於 2004/05/10 16:21:08
------
人生在勤,不索何获? |
ufjjc
一般會員 發表:18 回覆:47 積分:23 註冊:2002-05-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |