實作DLL遇到的相關問題 |
尚未結案
|
Maitreya229
一般會員 發表:3 回覆:7 積分:2 註冊:2010-09-06 發送簡訊給我 |
各位大大好,
我目前的問題有好幾點我稍微歸類一下問題點,再請各位有經驗的先知幫忙解惑一下,謝謝!! 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 發送簡訊給我 |
===================引 用 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 發送簡訊給我 |
感謝 P.D.版大抽空回答我的問題,
我之所以會搞得那麼複雜, ===================引 用 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" 結果都一樣. 恕刪...
編輯記錄
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
一點小建議 不曉得幫不幫得上忙
Sring = AnsiString 即使依照每個字元轉ASCII 還是可能AP判讀不了 可能你要把字元轉為Unicode的Byte() 再傳給AP端 另外你把收到的陣列 SetLength 內容好像會 Initial ? 變成每個元素都是 \0 ===================引 用 Maitreya229 文 章=================== 感謝 P.D.版大抽空回答我的問題, 我之所以會搞得那麼複雜,
問題就在於, 我如果直接回傳string的話, 在AP端接收到的會是一堆亂碼. |
Maitreya229
一般會員 發表:3 回覆:7 積分:2 註冊:2010-09-06 發送簡訊給我 |
|
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |