ASCII 轉換成DLL發生操作無效問題 |
答題得分者是:ha0009
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
在程式中使用函數呼叫 不會有 "Invalid pointer operation"操作無效問題產生,程式如下
function ASCIIShow(ACode: string): string; Var X,sTmp:string; I,J:Integer; begin J:=0; For I := 1 to Length(ACode) do begin //將字元轉換成為ASCII碼,重點指令Ord, %d表示10進制, %X表示16進制 X:= Format('%d', [Ord(ACode[i])]); J:=J StrToint(X); //將每各字元10進制數值相加 End; sTmp:=IntToHex(J,2); //將加總數值轉成HEX Result := sTmp; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add(ASCIIShow(Edit1.Text)); end;製作成為Dll檔案後 出現"Invalid pointer operation"操作無效問題 Dll程式碼 function asciisp(ACode: string): string;export; //設定函數 implementation function asciisp(ACode: string): string; Var X,sTmp:string; I,J:Integer; begin J:=0; For I := 1 to Length(ACode) do begin //將字元轉換成為ASCII碼,重點指令Ord, %d表示10進制, %X表示16進制 X:= Format('%d', [Ord(ACode[i])]); J:=J StrToint(X); //將每各字元10進制數值相加 End; sTmp:=IntToHex(J,2); //將加總數值轉成HEX Result := sTmp; end;請各位大大指教一下 當完成DLL以後 輸入!01200600這各字串給Dll轉換 就會發生錯誤,但是只要將上面的00變成 0 或 000 就沒有錯誤發生,改變其他字元也都沒問題就是這段不能00有人能夠幫我解釋這靈異事件嗎? 另外如果我最後Result 回來只想要 末2碼的hex程式要如何修改 分享比獲得更快樂--Juneo |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
引言: 你好: 傳遞字串的方式我有寫一個 Demo 你有興趣可以參考一下 < href="http://SourceProvide.deepen.com.tw/k_top/測試 DLL.exe">http://SourceProvide.deepen.com.tw/k_top/測試 DLL.exeha009 大大 仔細看過你的程式後,發現String 的方式很容易錯誤製作成Dll以後不容易被其他開發工具使用的感覺,是否需要改成PCHAR方式比較通用,很多錯誤好像由String所引起的(此部分指的是在DLL製作上) 分享比獲得更快樂--Juneo |
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
將 傳回String更換成為PChar 型態後出現有些數字轉換起來會變成空白
例如 將 !01200600 改成 $012 就無法顯示
將修改的程式碼給各位大大看看是是否有地方我弄錯了
Dll 部分
function asciisp(ACode: string): PChar;Stdcall;export; implementation function asciisp(ACode: string): PChar;Stdcall; Var X,sTmp:string; I,J:Integer; begin J:=0; For I := 1 to Length(ACode) do begin //將字元轉換成為ASCII碼,重點指令Ord, %d表示10進制, %X表示16進制 X:= Format('%d', [Ord(ACode[i])]); J:=J StrToint(X); //將每各字元10進制數值相加 End; sTmp:=IntToHex(J,2); //將加總數值轉成HEX Result := PChar(sTmp); end; App 部分 function asciisp(ACode: string): PChar;Stdcall; external 'Asciispy.dll';分享比獲得更快樂--Juneo |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好: 剛剛試過你的 asciisp 函式,確實會產生問題。但如果將程式 作下列的修正,就可以傳回正確答案。 Result := PChar(IntToHex(J,2)); 我的平台是 W2KS D6 下面列出我精簡過的 asciisp1 函式供你參考 function asciisp1(ACode: string): PChar;Stdcall; var idx : integer; Total : integer; begin Total := 0; for idx := 1 to Length (ACode) do Total := Total Ord (ACode [idx]); result := PChar (format ('%2x', [Total])); end; |
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
感謝ha0009跟William兩位大大熱心的回應,問題已經解決
引言:我將程式再次Post出來希望能夠跟ha0009寫精簡後程式比較,並且討論實際問題出在哪?Dll運作跟直接在程式中運作 程式上會有哪些不同 要注意哪些 因為我比較喜歡把常用的程式寫成DLL,雖然問題解決了還是想瞭解 ^___^你好: 剛剛試過你的 asciisp 函式,確實會產生問題。但如果將程式 作下列的修正,就可以傳回正確答案。 Result := PChar(IntToHex(J,2)); 我將程式修改成這樣 有些字串會無法使用 我的平台是 W2KS D6 下面列出我精簡過的 asciisp1 函式供你參考 function asciisp1(ACode: string): PChar;Stdcall; var idx : integer; Total : integer; begin Total := 0; for idx := 1 to Length (ACode) do Total := Total Ord (ACode [idx]); result := PChar (format ('%2x', [Total])); end;將DLL內我的函數內容更換成為你的程式,粉神奇的問題解決了 任何字串都能夠運算出來,DLL達到預期的效果 unit Unit1; interface Uses SysUtils, Dialogs;//, ShareMem; function asciisp(ACode: string): PChar;Stdcall;export; //設定函數 implementation function asciisp(ACode: string): PChar;Stdcall; Var X,sTmp:string; I,J:Integer; begin J:=0; For I := 1 to Length(ACode) do begin //將字元轉換成為ASCII碼,重點指令Ord, %d表示10進制, %X表示16進制 X:= Format('%d', [Ord(ACode[i])]); J:=J StrToint(X); //將每各字元10進制數值相加 End; //sTmp:=IntToHex(J,2); //將加總數值轉成HEX Result := PChar(IntToHex(J,2)); end; end.分享比獲得更快樂--Juneo |
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好: 測試結果如下 使用 asciisp 函式 !01200600 = 1AA $012 = !012000600 = #55555 = 使用 asciisp1 函式 !01200600 = 1AA $012 = B7 !012000600 = 1DA #55555 = 12C 你的函式移到主程式中可正確傳回,但移到 DLL 中 則會出錯,我也不知道原因。我的函式則均可正確完 成。你說有問題是使用 asciisp1 函式測試的嗎? 如 果是那可能與系統或版本有關了吧 > < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif"> |
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |