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

ASCII 轉換成DLL發生操作無效問題

答題得分者是:ha0009
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-01 14:07:09 IP:211.75.xxx.xxx 未訂閱
在程式中使用函數呼叫 不會有 "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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-01 14:41:50 IP:147.8.xxx.xxx 未訂閱
If you use string, you need to uses ShareMem (make it the 1st one) in both your exe and dll projects.
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-01 14:49:31 IP:211.75.xxx.xxx 未訂閱
我已經事先看過此篇文章 好像跟我一樣 只是我的問題出現在特定的字串 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=26599 加上uses ShareMem 確實能夠解決問題 但是卻會引發程式結束的時候產生錯誤(跟上偏錯誤一樣 =.=) >"< ~~~ 分享比獲得更快樂--Juneo
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-01 15:40:16 IP:219.80.xxx.xxx 未訂閱
你好: 傳遞字串的方式我有寫一個 Demo 你有興趣可以參考一下  < href="http://SourceProvide.deepen.com.tw/k_top/測試 DLL.exe">http://SourceProvide.deepen.com.tw/k_top/測試 DLL.exe
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-01 16:15:53 IP:211.20.xxx.xxx 未訂閱
引言: 你好: 傳遞字串的方式我有寫一個 Demo 你有興趣可以參考一下 < href="http://SourceProvide.deepen.com.tw/k_top/測試 DLL.exe">http://SourceProvide.deepen.com.tw/k_top/測試 DLL.exe
ha009 大大 仔細看過你的程式後,發現String 的方式很容易錯誤製作成Dll以後不容易被其他開發工具使用的感覺,是否需要改成PCHAR方式比較通用,很多錯誤好像由String所引起的(此部分指的是在DLL製作上) 分享比獲得更快樂--Juneo
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-01 17:10:47 IP:211.75.xxx.xxx 未訂閱
將 傳回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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-01 17:51:08 IP:147.8.xxx.xxx 未訂閱
PChar is a pointer and you need to allocate necessary memory for it. If both exe and dll are made with Delphi, using ShareMem could be easier in your case. Make ShareMem listed the very first unit in the uses clause inside both dpr files.
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-02 08:25:25 IP:211.20.xxx.xxx 未訂閱
我將原始程式整各上傳到這請各位看一下 http://delphi.ktop.com.tw/loadfile.php?TOPICID=17456336&CC=390404 分享比獲得更快樂--Juneo
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-02 09:23:56 IP:219.80.xxx.xxx 未訂閱
你好:
  剛剛試過你的 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-02 11:38:28 IP:211.75.xxx.xxx 未訂閱
ha0009 大大 我試著改過程式後 字串 !01200600 確實不會有問題 但是修改成其他字串 會變成沒有顯示出該有的運算結果 再麻煩你測試以下字串 !01200600 $012 !012000600 #55555 當我使用這些字串都會沒有運算結果 是運算錯誤 還是程式方面的問題 稍後我將沒有寫成DLL檔案的原始程式寄給你 只有程式轉成DLL才會有上面我門討論的問題 分享比獲得更快樂--Juneo
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-02 12:05:21 IP:211.20.xxx.xxx 未訂閱
感謝ha0009跟William兩位大大熱心的回應,問題已經解決
引言:
你好:
  剛剛試過你的 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達到預期的效果
我將程式再次Post出來希望能夠跟ha0009寫精簡後程式比較,並且討論實際問題出在哪?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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-09-02 12:10:59 IP:211.20.xxx.xxx 未訂閱
用到黃色字因為不明顯所以重新在這把上偏黃色字重新post    感謝ha0009跟William兩位大大熱心的回應,問題已經解決 作下列的修正,就可以傳回正確答案。 Result := PChar(IntToHex(J,2)); 我將程式修改成這樣 有些字串會無法使用 將DLL內我的函數內容更換成為你的程式,粉神奇的問題解決了 任何字串都能夠運算出來,DLL達到預期的效果 分享比獲得更快樂--Juneo
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-09-02 12:12:49 IP:219.80.xxx.xxx 未訂閱
你好:
  測試結果如下    使用 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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-09-02 12:39:38 IP:211.20.xxx.xxx 未訂閱
ha0009 大大 asciisp1 函式 沒問題--OK    是我的asciisp 函式有問題 可是asciisp 函式寫在主程式段就沒問題 想瞭解為什麼程式在主程式沒問題 在DLL就有問題 我猜可能是轉換上的問題 < > 感謝兩位大大熱心的幫助,這次學到很多< > 分享比獲得更快樂--Juneo
系統時間:2024-05-19 3:32:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!