Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verschüsselungs-DLL mit Fehlern (https://www.delphipraxis.net/129562-verschuesselungs-dll-mit-fehlern.html)

RebellX 21. Feb 2009 09:59


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:
showmessage(crypt(edit2.Text));
Die DLL wird so eingebunden:
Delphi-Quellcode:
  function crypt(s: string): string; stdcall;
  external {$IFDEF __GPC__}name 'crypt'{$ELSE} 'PCrypt.dll'{$ENDIF __GPC__};
und so sieht sie aus:

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.

nuclearping 21. Feb 2009 10:31

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)

Luckie 21. Feb 2009 10:33

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: http://www.michael-puff.de/Artikel/StringDLL.shtml

RebellX 21. Feb 2009 10:41

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

nuclearping 21. Feb 2009 10:45

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.

RebellX 21. Feb 2009 11:09

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:

"0 to ..." ist aber 100% falsch.
Dazu hab ich gefunden, dass ohne -1 jetzt noch ein Fehler kommt, mit aber nocht (15 Testläufe).

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

Sir Rufo 21. Feb 2009 11:40

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.

Luckie 21. Feb 2009 11:45

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.

mr_emre_d 21. Feb 2009 12:05

Re: Verschüsselungs-DLL mit Fehlern
 
Zitat:

Zitat von nuclearping
"0 to ..." ist aber 100% falsch.

Ich würd mir das nochmal überlegen !

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:
  str := ';)';
  for i := -3 to Length(Str)-4 do
    Str[i+4] := Chr( Ord(str[i+4]) + 3 );
PS: OK ich habe nochmal nachgesehen und bemerkt, dass er falsch *indiziert

Aber deine Aussagen ist zu 100% falsch.

MfG

nuclearping 21. Feb 2009 13:08

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 16:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz