全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2515
推到 Plurk!
推到 Facebook!

使用動態陣列當dll的參數 ?

 
cooper
一般會員


發表:17
回覆:41
積分:11
註冊:2002-03-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-05-17 09:49:26 IP:163.31.xxx.xxx 未訂閱
各位好我需要傳一個dynamic array當作dll export出來的參數,如下所示:
in DLL:
procedure setValue(names: array of String);
begin
  for i:=0 to High(names) do
    names[i] := 'good'   IntToStr(i);
end;    in Application(EXE)
procedure test;
var
  names: array of String;
begin
  SetLength(names, 10);
  setValue(names); //call the dll's function
end;
可是這樣是不行的,因為行程的process space的關係,我所查到的資料是將此變數使用Shared memory的方式來宣告,可是資料上並未說明該怎麼使用shared memory的機制,不知各位前是否可以給小弟一些指引呢 ?(或者不用shared memory也可傳dynamic array給dll呢?) Regards, cooper ~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-05-19 08:29:23 IP:61.219.xxx.xxx 未訂閱
引言: 各位好我需要傳一個dynamic array當作dll export出來的參數,如下所示: 可是這樣是不行的,因為行程的process space的關係,我所查到的資料是將此變數使用Shared memory的方式來宣告,可是資料上並未說明該怎麼使用shared memory的機制,不知各位前是否可以給小弟一些指引呢 ?(或者不用shared memory也可傳dynamic array給dll呢?)
不太清處您的問題所在,是值傳不進去DLL中,或是傳不回來? 或是有錯誤訊息? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
morgan
一般會員


發表:0
回覆:3
積分:0
註冊:2002-05-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-05-19 14:33:21 IP:203.160.xxx.xxx 未訂閱
You should do like this: in DLL: procedure setValue(VAR names: array of String); or the setValue of dll can't modify the names's value of the main application. 聆彸 發表人 - morgan 於 2002/05/20 10:32:28
cooper
一般會員


發表:17
回覆:41
積分:11
註冊:2002-03-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-05-30 22:51:56 IP:61.231.xxx.xxx 未訂閱
引言: 不太清處您的問題所在,是值傳不進去DLL中,或是傳不回來? 或是有錯誤訊息? ~~~Delphi K.Top討論區站長~~~
不好意思 ~ 最近有點小忙 ~ 我想我可能沒表達清楚我的問題 我的問題是當我們寫了一個dll時 ~ 基本上dll所佔的memory space (address space)跟exe是不同的,則當dll要跟exe共用某塊資料時可 能就必須透過SHM(Shared Memory),我有查到共用使用者自訂型態的 方式,可是同樣的原理用到dynamic array上就不太行說 (基本上OPLG中有提到若在dll中用user define type或dynamic array 時需使用SHM的方式,但並未說明如何使用 @@") Regards, cooper
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-05-31 09:40:08 IP:61.231.xxx.xxx 未訂閱
引言: 不好意思 ~ 最近有點小忙 ~ 我想我可能沒表達清楚我的問題 我的問題是當我們寫了一個dll時 ~ 基本上dll所佔的memory space (address space)跟exe是不同的,則當dll要跟exe共用某塊資料時可 能就必須透過SHM(Shared Memory),我有查到共用使用者自訂型態的 方式,可是同樣的原理用到dynamic array上就不太行說 (基本上OPLG中有提到若在dll中用user define type或dynamic array 時需使用SHM的方式,但並未說明如何使用 @@") Regards, cooper
dll 與 exe 一定在不同的記憶體區塊,不過,在 dll 中 new 出來的動態陣列,只要將指標傳出, exe 收得到就可以在 exe 用,因為 exe 載入後,所有它用到的 dll 都會在同一個 Segment 內,只是 dll 的 Offset 通常在比較後面而 exe 通常在比較前面,不過,都是一個指標可以指得到的範圍,不一定要透過 Shared Memory。其實 Shard Memory 也是由一個模組在維護 Share 的記憶體區塊指標,有需求者向它申請或取用。
------
http://www.ViewMove.com
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-05-31 09:45:12 IP:61.231.xxx.xxx 未訂閱
引言: dll 與 exe 一定在不同的記憶體區塊... exe 載入後,所有它用到的 dll 都會在同一個 Segment 內,只是 dll 的 Offset 通常在比較後面而 exe 通常在比較前面...
可以到以下網址下載 Delphi Application Peeper Lite http://www.devrace.com/dap/lite.php Delphi Application Peeper Lite Using DAP Lite you can click any visual component of applications designed in Delphi or C Builder and see at runtime the following things: The name of the component; The class name of the component; The name of the component's parent; The list of ancestors of the component (moreover, for any ancestor DAP Lite will show the unit, in which the ancestor class is described); The list of modules (DLLs) used by the application being investigated. It's absolutely transparent to the application being observed! DAP does not show source code but it does show published information included into the executable file.
------
http://www.ViewMove.com
cooper
一般會員


發表:17
回覆:41
積分:11
註冊:2002-03-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-06-01 17:02:34 IP:61.231.xxx.xxx 未訂閱
引言: dll 與 exe 一定在不同的記憶體區塊,不過,在 dll 中 new 出來的動態陣列,只要將指標傳出, exe 收得到就可以在 exe 用,因為 exe 載入後,所有它用到的 dll 都會在同一個 Segment 內,只是 dll 的 Offset 通常在比較後面而 exe 通常在比較前面,不過,都是一個指標可以指得到的範圍,不一定要透過 Shared Memory。其實 Shard Memory 也是由一個模組在維護 Share 的記憶體區塊指標,有需求者向它申請或取用。
不好意思請問要怎麼export出dynamic array的指標呢 ? 而如果我需要兩個以 上的指標時又要怎麼export ? 另外我們可以肯定dll被load到memory之後一定 不會超出pointer的範圍嗎 ? 不好意思真的不太董 ~ 可以給我一些reference 嗎 ? 謝謝您囉(基本上我已經用SHM完成了~可是還是想了解您所說的做法 :p) Regards, cooper
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-06-02 11:28:09 IP:61.59.xxx.xxx 未訂閱
引言: 不好意思請問要怎麼export出dynamic array的指標呢 ? 而如果我需要兩個以 上的指標時又要怎麼export ? 另外我們可以肯定dll被load到memory之後一定 不會超出pointer的範圍嗎 ? 不好意思真的不太董 ~ 可以給我一些reference 嗎 ? 謝謝您囉(基本上我已經用SHM完成了~可是還是想了解您所說的做法 :p) Regards, cooper
用 pascal 我不會,用 C 的話,在 DLL 使用 __declspec(dllexport) int **Share2DintArray; 放在整體變數,那這個 DLL 就會將這個 2D 的整數指標給分享出來。 別的 DLL 或 EXE 要使用,只要宣告 __declspec(dllimport) int **Share2DintArray; 就可以使用。 如果要兩個以上,那用上述的方法自然得多宣告幾個。 也可以在 DLL 中用 __declspec(dllexport) int ** _stdcall New2DIntArray(int size1,int size2); 在函式中建立 2D 陣列再將指標傳出即可。 在 Win32 中,你的指標應該都會在 4GB 以內,是一個 32 位元指標可以存取的,所以指標都可以指到。目前我對 WinProgramming 的認知只到這個程度,要破 4GB 的定址方式我就不了...
------
http://www.ViewMove.com
cooper
一般會員


發表:17
回覆:41
積分:11
註冊:2002-03-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-06-02 22:22:55 IP:61.231.xxx.xxx 未訂閱
引言: 用 pascal 我不會,用 C 的話,在 DLL 使用 __declspec(dllexport) int **Share2DintArray; 放在整體變數,那這個 DLL 就會將這個 2D 的整數指標給分享出來。 別的 DLL 或 EXE 要使用,只要宣告 __declspec(dllimport) int **Share2DintArray; 就可以使用。 如果要兩個以上,那用上述的方法自然得多宣告幾個。 也可以在 DLL 中用 __declspec(dllexport) int ** _stdcall New2DIntArray(int size1,int size2); 在函式中建立 2D 陣列再將指標傳出即可。 在 Win32 中,你的指標應該都會在 4GB 以內,是一個 32 位元指標可以存取的,所以指標都可以指到。目前我對 WinProgramming 的認知只到這個程度,要破 4GB 的定址方式我就不了...
謝謝您唷 ~ C 的部分我以前有試過,所以大概知道怎麼做 ~ 只是現在移到 delphi就不太清楚要怎麼做了 ~ 不過這兩天又試了一下我發現其實SHM和您 所說的傳一個pointer在運作模式上市很類似的 :p Regards, cooper
系統時間:2024-04-26 10:17:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!