線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1679
推到 Plurk!
推到 Facebook!

實作DLL遇到的相關問題

尚未結案
Maitreya229
一般會員


發表:3
回覆:7
積分:2
註冊:2010-09-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-09-09 19:35:46 IP:218.211.xxx.xxx 訂閱
各位大大好,
我目前的問題有好幾點我稍微歸類一下問題點,再請各位有經驗的先知幫忙解惑一下,謝謝!!

1.如果於dll的function中傳入一個pchar,
我於參數傳入前先指定給一個string變數.
例如:
var
meg:string;
testPchar:PChar;

begin
meg:='wow!! test success , 2010/09/09.';
test:=Addr(meg);
testFun(testPchar);
//之後秀出meg的值,也許已在testFun被修改為 'test12345'
end

那pchar傳入後,在testFun裡面應該要如何才能正確修改所指定的變數值?
因為我試過一些寫法,不是有錯誤就是meg最後的值裡面是一片空白,
我想可能是我的觀念不夠正確,或者寫法有誤.


2.試過用var,
可是傳進去Function的參數之後都是亂碼.

變成亂碼的情形不曉得各位先進有沒有遇過?
感覺好像是編碼上出了問題,
可是我在參數傳入前的型態是string,
在function丟的值是'xxx' (應該也是string?).

我如果在dll中的function,
不帶入任何參數,僅直接傳回一個字串(ASCII碼),
在接收端收到的直接就是亂碼.

這個問題...應該要如何解決?我試著改為回傳ShortString,
則會出現錯誤訊息" method's type signature is not Pinvoke compatible "


3.再請教一個問題,
我試著要回傳array of string
我在同一個form中測試成功,
可是當我包成dll之後遇到一個問題.

出現錯誤訊息 " Can not marshal return value "

我想錯誤應該是出在 type底下的 String_Array = array[1..3] of string;

即便我在form底下做同樣的類型宣告( String_Array = array[1..6] of string; ),
使用相同宣告的變數去接回傳值還是一樣錯誤.
例:
var
temp : String_Array;
begin
temp := returnStringArray();

有辦法使用dll中的type來宣告變數嗎?
如果可以的話應該要怎麼做?



P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-09-10 15:41:17 IP:118.169.xxx.xxx 未訂閱

===================引 用 Maitreya229 文 章===================
各位大大好,
兩種方法, 第一種最簡單, 定義function 回傳值 stirng, 或 pchar, 如果對function回值不熟, 這是基本功, 請查
第二種, 定義function 參數為 var
myfunt( var: msg): ...
這樣 msg 在 myfun的運算結果會丟回原來的 msg 變數


2.試過用var,
可是傳進去Function的參數之後都是亂碼.

變成亂碼的情形不曉得各位先進有沒有遇過?
感覺好像是編碼上出了問題,
可是我在參數傳入前的型態是string,
在function丟的值是'xxx' (應該也是string?).
,定義 string, 就用 stinrg 接, 同理 pchar

我如果在dll中的function,
不帶入任何參數,僅直接傳回一個字串(ASCII碼),
在接收端收到的直接就是亂碼.
ascii 是 0-127的十進位數值, 或許你改為回傳整數(word)

這個問題...應該要如何解決?我試著改為回傳ShortString,
則會出現錯誤訊息" method's type signature is not Pinvoke compatible "


3.再請教一個問題,
我試著要回傳array of string
我在同一個form中測試成功,
可是當我包成dll之後遇到一個問題.

出現錯誤訊息 "? Can not marshal return value "

我想錯誤應該是出在 type底下的 String_Array = array[1..3] of string;

即便我在form底下做同樣的類型宣告( String_Array = array[1..6] of string; ),
使用相同宣告的變數去接回傳值還是一樣錯誤.
例:
var
? temp : String_Array;
begin
? temp := returnStringArray();

有辦法使用dll中的type來宣告變數嗎?
如果可以的話應該要怎麼做?

?
dll 也可視為一支 exe的執行檔, 這段我不熟, 但討論區有討論到變數如何在記憶體中共用,
你可以找找看


Maitreya229
一般會員


發表:3
回覆:7
積分:2
註冊:2010-09-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-09-10 18:01:44 IP:192.192.xxx.xxx 訂閱
感謝 P.D.版大抽空回答我的問題,
我之所以會搞得那麼複雜,
問題就在於,
我如果直接回傳string的話,
在AP端接收到的會是一堆亂碼.

即便是在參數的地方用var也是一樣.

轉成integer再轉回ASCII的方式我目前正在用,
可是產生了新的問題,
我宣告一個新的type array of integer
函式參數帶入是用var,然後在函式內宣告array的大小.

可是不管我宣告多大[100]、[4]、[2],
回到AP端的時候,
都只能抓得到[0]裡面的資料,
更正確的說是陣列大小都只有1.

不曉得各位先進有沒有這種經驗?

我用的是delphi 2006 for .net

DLL檔案產生的方式當初是選擇"Delphi for .NET Projects -> Libary"

AP端的話試過"VCL Forms Application"
以及"Windows Forms Application"
結果都一樣.
===================引 用 P.D. 文 章===================

恕刪...

編輯記錄
Maitreya229 重新編輯於 2010-09-10 18:03:18, 註解 無‧
Maitreya229 重新編輯於 2010-09-12 20:18:56, 註解 無‧
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-09-11 18:07:33 IP:114.32.xxx.xxx 訂閱
一點小建議  不曉得幫不幫得上忙

Sring = AnsiString 即使依照每個字元轉ASCII 還是可能AP判讀不了
可能你要把字元轉為Unicode的Byte() 再傳給AP端

另外你把收到的陣列 SetLength 內容好像會 Initial ? 變成每個元素都是 \0

===================引 用 Maitreya229 文 章===================
感謝 P.D.版大抽空回答我的問題,
我之所以會搞得那麼複雜,
問題就在於,
我如果直接回傳string的話,
在AP端接收到的會是一堆亂碼.
編輯記錄
pprayer 重新編輯於 2010-09-11 18:09:34, 註解 無‧
pprayer 重新編輯於 2010-09-11 18:14:07, 註解 無‧
Maitreya229
一般會員


發表:3
回覆:7
積分:2
註冊:2010-09-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-09-11 19:58:57 IP:59.121.xxx.xxx 訂閱
感謝pprayer給小弟回覆,
我之所以會搞得那麼複雜,
問題就在於,
我如果直接回傳string的話,
在AP端接收到的會是一堆亂碼.
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-10-11 18:23:35 IP:220.130.xxx.xxx 訂閱
 可以很確定的一點是, DLL傳回值要避免用 String 而改用 PChar or PAnsiChar
如果呼叫你DLL得程是不是用Delphi寫的, 那就更不行了
------
Mephise Chen
前興德工程師
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-10-21 17:40:28 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-07 1:18:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!