![]() |
Verschüsselungs-DLL mit Fehlern
Hallo,
ich habe folgendes Problem: Ich will einen String in einen String aus Zahlen verschlüsseln, aber je nach länge des eingegebenen Strings kommt entweder: -Ungültige Zeigeroperation -Zugriffsverletzung bei Adresse 00321F95 im Modul 'Crypt.dll' Lesen der Adresse 0000018 -Das Fenster schließt sich einfach Hier der Code:
Delphi-Quellcode:
Die DLL wird so eingebunden:
showmessage(crypt(edit2.Text));
Delphi-Quellcode:
und so sieht sie aus:
function crypt(s: string): string; stdcall;
external {$IFDEF __GPC__}name 'crypt'{$ELSE} 'PCrypt.dll'{$ENDIF __GPC__};
Delphi-Quellcode:
library PCrypt;
uses FastShareMem, SysUtils, Classes; const list: array [1..62] of string = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); list2: array [1..62] of string = ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'); function crypt1(s: string): string; stdcall; var wert: array of byte; i, j: integer; ende: string; begin s := s + 'A'; randseed := 4546464; setlength(wert, length(s)); ende := ''; for i := 0 to length(s)-1 do begin for j := 1 to 62 do begin if copy(s, i, 1) = list[j] then wert[i] := j; end; ende := ende+inttostr(wert[i])+inttostr(random(wert[i])); end; for i := 0 to length(s)-1 do begin for j := 1 to 62 do begin if copy(s, i, 1) = list2[j] then wert[i] := j; end; ende := ende+inttostr(wert[i])+inttostr(random(wert[i])); end; result := ende; end; function crypt(s: string): string; stdcall; export; var s1, s2: string; begin s1 := crypt1(s); s2 := crypt1(s1); result := s2; end; {$R *.res} exports Crypt; begin end. |
Re: Verschüsselungs-DLL mit Fehlern
1.) Mit Strings in DLLs arbeiten -> Pfui
2.) Code-Einrückung faktisch nicht vorhanden. Wer soll da durchblicken? -> Pfui 3.) Strings gehen von 1-Length. Nicht von 0-Length (-1) |
Re: Verschüsselungs-DLL mit Fehlern
Deine for-Schleifen für die Strings sind falsch. Der ertse Buchstabe eines Strings steht an der Position 1 und nicht null. Ob das allerdings für den Fehler verantwortlich ist, kann ich aber nicht sagen. Ist mir nur aufgefallen.
Ach so und man kann nicht so einfach Strings an DLLs übergeben und wieder zurückgeben. Siehe dazu meinen Artikel: ![]() |
Re: Verschüsselungs-DLL mit Fehlern
Ob ich jetzt
for i := 1 to length(s) do oder for i := 0 to length(s)-1 do schreibe macht bei dem Problem irgendwie aber keinen unterschied. Was die DLL angeht: ich wollte das ganze mal so ausprobieren... Ohne DLL komm ich zu den gleichen Fehlern... Statt ShareMem verwende ich halt FastShareMem, die braucht kein e weitere DLL. RebellX |
Re: Verschüsselungs-DLL mit Fehlern
"0 to ..." ist aber 100% falsch.
Wenn's daran nicht lag, liegts woanders. Breakpoints setzen, F7 und F8 bemühen. ... Aber vorher würde ich erstmal ordentlich einrücken. |
Re: Verschüsselungs-DLL mit Fehlern
Also ich hab mir das jetzt nochmal angeschaut in der DLL. Aber haltepunkte waren da nicht möglich,
also hab ichs kurz in ne Unit gepackt. Zitat:
Laufen tut das ganze jetzt ohne (sichtbare) Fehler. Ums Einrücken werd ich mich in Zukunft bemühen, auch wenn mir selbst der Code dann unübersichtlich vorkommt^^. RebellX |
Re: Verschüsselungs-DLL mit Fehlern
:wiejetzt:
was ist denn an einem formatierten Code unübersichtlich? das man sieht wie die Blöcke zusammenhängen? Nun ja, jeder hat da ja eine andere Wahrnehmung ...
Delphi-Quellcode:
library PCrypt;
uses FastShareMem, SysUtils, Classes; const list: array [1..62] of string = ( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' ); list2: array [1..62] of string = ( '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ); function crypt1(s: string): string; stdcall; var wert: array of byte; i, j: integer; ende: string; begin s := s + 'A'; randseed := 4546464; SetLength( wert, Length( s ) ); ende := ''; for i := 0 to Length( s ) - 1 do begin for j := 1 to 62 do if ( Copy( s, i, 1 ) = list[ j ] ) then wert[ i ] := j; ende := ende + IntToStr( wert[ i ] ) + IntToStr( Random( wert[ i ] ) ); end; for i := 0 to Length( s ) - 1 do begin for j := 1 to 62 do if ( Copy( s, i, 1 ) = list2[ j ] ) then wert[ i ] := j; ende := ende + IntToStr( wert[ i ] ) + IntToStr( Random( wert[ i ] ) ); end; result := ende; end; function crypt(s: string): string; stdcall; export; var s1, s2: string; begin s1 := crypt1( s ); s2 := crypt1( s1 ); result := s2; end; {$R *.res} exports Crypt; begin end. |
Re: Verschüsselungs-DLL mit Fehlern
@Rufo: Deine if-Schreibweise in drei Zeilen ist aber auch gewöhnungsbedürftig und, wie ich finde, unübersichtlich.
|
Re: Verschüsselungs-DLL mit Fehlern
Zitat:
Es ist eigentlich ziemlich wurscht, wie die Schleife ausschaut. Im Endeffekt ist es wichtig, wie er indiziert (nennt man das - zugreifen auf einzelne Werte eines Strings - so ?)
Delphi-Quellcode:
PS: OK ich habe nochmal nachgesehen und bemerkt, dass er falsch *indiziert
str := ';)';
for i := -3 to Length(Str)-4 do Str[i+4] := Chr( Ord(str[i+4]) + 3 ); Aber deine Aussagen ist zu 100% falsch. MfG |
Re: Verschüsselungs-DLL mit Fehlern
Wenn er eine Schleife hat "i := 0 to ..." und dort auch auf String[i] zugreift, ist das 100% falsch.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz