Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi StrLCopy : Non VCL (https://www.delphipraxis.net/56151-strlcopy-non-vcl.html)

IronCobra 1. Nov 2005 14:35


StrLCopy : Non VCL
 
Hallo,

hätte da mal eine Frage. Arbeite gerade an Non-VCL Projekten und muß StrLCopy benutzen. Da ich aber keine SysUtils nutzen will, hier meine Frage:

Gibt es die Möglichkeit StrLCopy als Non-VCL Funktion einzubinden? Und wenn ja welche verschiedenen Möglichkeiten gibt es?

Vielen Dank im voraus!!

Rastaman 1. Nov 2005 14:40

Re: StrLCopy : Non VCL
 
Also ich hab mir die Funktion mal in der Delphi Hile angesehn, und in meinen Augen ist die Funktion
genau das gleiche wie die Copy-Funktion, und die ist in der Windows Unit enthalten.

Luckie 1. Nov 2005 16:49

Re: StrLCopy : Non VCL
 
MSDN -> MSDN-Library durchsuchenStrCpyN ;)

IronCobra 1. Nov 2005 18:28

Re: StrLCopy : Non VCL
 
Luckie & ALL - danke für die Info .. aber wie benutzt man das genau (StrCpyN) um genau die Funktionen von StrLCopy zu gewährleisten? Danke

PS: Für StrCpyN benötige ich doch die Lightweight API, richtig? Oder kann man diese auch mit shellapi in den uses nutzen?

Luckie 1. Nov 2005 18:38

Re: StrLCopy : Non VCL
 
Was ist die LightWeight API? Ich kenne nur eine Windows API zum Beispiel. Und deklariert sein dürfte es in der Windows.pas.

IronCobra 1. Nov 2005 19:12

Re: StrLCopy : Non VCL
 
Wäre es nicht möglich einfach die StrLCopy Function aus der SysUtils in mein App einzubauen? Dadurch müßte nicht die ganze SysUtils genutzt werden, sondern nur StrLCopy - müßte doch funktionieren, oder?

Nur wenn ja, wo kann ich die Funktion finden für StrLCopy in den SysUtils? Danke!!

Luckie 1. Nov 2005 19:31

Re: StrLCopy : Non VCL
 
Zitat:

Zitat von IronCobra
Nur wenn ja, wo kann ich die Funktion finden für StrLCopy in den SysUtils? Danke!!

In der SysUtils.pas?

turboPASCAL 1. Nov 2005 20:59

Re: StrLCopy : Non VCL
 
Guckst Du Forensuche ? Hier im Forum suchenStrLCopy AND StrPCopy

IronCobra 2. Nov 2005 03:57

Re: StrLCopy : Non VCL
 
Habs hinbekommen mit API ... lstrcpyn ... danke für die Tips

SirThornberry 2. Nov 2005 06:17

Re: StrLCopy : Non VCL
 
anstelle von StrLCopy etc. kann man auch einfach move nehmen.

hathor 28. Apr 2012 00:23

AW: StrLCopy : Non VCL
 
Delphi-Quellcode:
function StrLCopy(Dest, Source: PChar; MaxLen: Cardinal): PChar;
var
  Count: Cardinal;
begin
  // copies a specified maximum number of characters from Source to Dest
  Result := Dest;
  Count := 0;
  While (Count < MaxLen) and (Source^ <> #0) do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Inc(Count);
  end;
  Dest^ := #0;
end;

himitsu 28. Apr 2012 01:44

AW: StrLCopy : Non VCL
 
Oder MSDN-Library durchsuchenlstrcpyn (Unit Windows)

@hathor: Deine Funktion vergißt die abschließende #0 mitzuzählen.
Delphi-Quellcode:
/// <description> copies a specified maximum number of characters from Source to Dest </description>
function StrLCopy(Dest, Source: PChar; MaxLen: NativeUInt): PChar;
begin
  Dec(MaxLen); // für die abschließende #0
  if NativeInt(MaxLen) < 0 then
    Exit(nil);
  Result := Dest;
  while (MaxLen > 0) and (Source^ <> #0) do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Dec(MaxLen);
  end;
  Dest^ := #0;
end;

hathor 28. Apr 2012 04:55

AW: StrLCopy : Non VCL
 
Lazarus kennt NativeUInt und NativeInt nicht.

Geändert:

Dummerweise ist jetzt der String Firmware Rev kürzer - also ist meine Version richtig...
http://www.delphipraxis.net/1163962-post21.html

Delphi-Quellcode:
/// <description> copies a specified maximum number of characters from Source to Dest </description>
function StrLCopy(Dest, Source: PChar; MaxLen: UInt64): PChar;
begin
  Dec(MaxLen); // für die abschließende #0
  if Int64(MaxLen) < 0 then
    Exit(nil);
  Result := Dest;
  while (MaxLen > 0) and (Source^ <> #0) do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Dec(MaxLen);
  end;
  Dest^ := #0;
end;

himitsu 28. Apr 2012 09:28

AW: StrLCopy : Non VCL
 
Wie nennt sich denn der echte "Integer" (dynamischer und potentieller 64-Bit-Integer) im Lazarus?

Kannst du mal mit MSDN-Library durchsuchenlstrcpyn testen, was dabei raus kommt?

hathor 28. Apr 2012 12:01

AW: StrLCopy : Non VCL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Übrigens: lstrcpyn function - MSDN schreibt:
Copies a specified number of characters from a source string into a buffer.
Warning Do not use.
Consider using StringCchCopy instead.

Bevor ich das mit LAZARUS testen kann (ist auf einem anderen Notebook) zeige ich mal den Code von der Borland Software Corporation:

Delphi-Quellcode:
function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;
asm
        PUSH   EDI
        PUSH   ESI
        PUSH   EBX
        MOV    ESI,EAX
        MOV    EDI,EDX
        MOV    EBX,ECX
        XOR    AL,AL
        TEST   ECX,ECX
        JZ     @@1
        REPNE  SCASB
        JNE    @@1
        INC    ECX
@@1:   SUB    EBX,ECX
        MOV    EDI,ESI
        MOV    ESI,EDX
        MOV    EDX,EDI
        MOV    ECX,EBX
        SHR    ECX,2
        REP    MOVSD
        MOV    ECX,EBX
        AND    ECX,3
        REP    MOVSB
        STOSB
        MOV    EAX,EDX
        POP    EBX
        POP    ESI
        POP    EDI
end;
---------------
FPC currently uses 32 bits (4 bytes) for integers, whether the machine is a 32-bit or 64-bit machine. This will cause code expecting an integer and a pointer to be the same size to fail as a 64-bit machine uses 64-bit pointers. To allow you to write portable code, the FPC system unit introduces the types PtrInt and PtrUInt which are signed and unsigned integer data types with the same size as a pointer.
http://wiki.freepascal.org/Integer

himitsu 28. Apr 2012 12:17

AW: StrLCopy : Non VCL
 
Och, die Hinweise für C++ (ala man sollte Makros wie StringCchCopy verwenden) ignoriere ich grundsätzlich. :angle2:


@hator: Tausch besser noch schnell das PChar durch PAnsiChar aus,
denn dieser Code ist definitiv nur für ANSI geeignet.


[add]
ASM > Pascal
Delphi-Quellcode:
function StrLCopy(Dest, Source: PAnsiChar; MaxLen: Cardinal): PAnsiChar;
var
  i: Cardinal;
begin
  if Byte(Dest) <> 0 then begin
    i := MaxLen;
    while Source^ <> #0 do begin
      Dest^ := Source^;
      Inc(Source);
      Inc(Dest);
      Dec(i);
    end;
    Inc(i);
  end;
  Dec(MaxLen, i);
  Source := Dest;  // hier hab ich wohl irgendwas falsch übersetzt (ich versuch's später nochmal)
  Dest  := Result; //
  Result := Source; //
{****
  i := MaxLen shr 2;
  while i > 0 do begin
    PLongWord(Dest)^ := PLongWord(Source)^;
    Inc(Source, 4);
    Inc(Dest, 4);
    Dec(i);
  end;
  i := MaxLen and 3;
  while i > 0 do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Dec(i);
  end;
*****}
  while MaxLen > 0 do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Dec(MaxLen);
  end;
{*****}
  Dest^ := #0;
end;

hathor 28. Apr 2012 17:06

AW: StrLCopy : Non VCL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1163978)
Kannst du mal mit MSDN-Library durchsuchenlstrcpyn testen, was dabei raus kommt?

Bei der Firmware fehlt eine 1.
Das Array ist 8 Char gross - also sollten auch 8 Char zurückgegeben werden:
sFirmwareRevArray[0..7] of Char;

Ich verwende jetzt Move - das geht auch und FEHLERFREI!

Delphi-Quellcode:
procedure PrintIdSectorInfo( IdSector : TIdSector );
var szOutBuffer : Array [0..40] of Char;
begin
  with IdSector do
  begin
    ChangeByteOrder( sModelNumber, SizeOf(sModelNumber) ); // Change the WORD array to a BYTE array
    szOutBuffer[SizeOf(sModelNumber)] := #0;
//    StrLCopy( szOutBuffer, sModelNumber, SizeOf(sModelNumber) );
//    lstrcpyn( szOutBuffer, sModelNumber, SizeOf(sModelNumber) );
    System.Move(sModelNumber, szOutBuffer, SizeOf(sModelNumber) );
    Form1.label1.caption :='Model :                 ' + szOutBuffer ;

    ChangeByteOrder( sFirmwareRev, SizeOf(sFirmwareRev) );
    szOutBuffer[SizeOf(sFirmwareRev)] := #0;
//    StrLCopy( szOutBuffer, sFirmwareRev, SizeOf(sFirmwareRev) );
//    lstrcpyn( szOutBuffer, sFirmwareRev, SizeOf(sFirmwareRev) );
    System.Move(sFirmwareRev, szOutBuffer, SizeOf(sFirmwareRev) );
    Form1.label2.caption := 'Firmware Rev :        ' + szOutBuffer ;

    ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) );
    szOutBuffer[SizeOf(sSerialNumber)] := #0;
 //   StrLCopy( szOutBuffer, sSerialNumber, SizeOf(sSerialNumber) );
 //   lstrcpyn(szOutBuffer, sSerialNumber, SizeOf(sSerialNumber) );
    System.Move(sSerialNumber, szOutBuffer, SizeOf(sSerialNumber) );
    Form1.label3.caption := 'Serial Number : '+ szOutBuffer ;
  end;
end;
http://www.delphipraxis.net/1163962-post21.html

himitsu 28. Apr 2012 17:51

AW: StrLCopy : Non VCL
 
Zitat:

Das Array ist 8 Char gross - also sollten auch 8 Char zurückgegeben werden:
sFirmwareRevArray[0..7] of Char;
Falsch.
maximal 7 Chars + #0 :stupid: (also, wenn man auf PChar-Funktionen zurückgreift)

hathor 28. Apr 2012 17:54

AW: StrLCopy : Non VCL
 
Als Teil eines Records entfällt #0.

himitsu 28. Apr 2012 17:56

AW: StrLCopy : Non VCL
 
Zitat:

Zitat von hathor (Beitrag 1164067)
Als Teil eines Records entfällt #0.

Das wissen aber nicht diese Funktionen ... für die muß es immer mit einer #0 enden, da ausschließlich die #0 als Ende gilt.

Delphi-Quellcode:
lstrcpyn( szOutBuffer, sModelNumber, SizeOf(sModelNumber) + SizeOf(sModelNumber[0]) );
Nur der Zielpuffer muß natürluch groß genug sein.

Luckie 29. Apr 2012 03:53

AW: StrLCopy : Non VCL
 
Hat das eigentlich noch irgendeinen praktischen Sinn oder macht ihr gerade einen Wettbewerb daraus? ;)

hathor 29. Apr 2012 08:19

AW: StrLCopy : Non VCL
 
Nee, die Sache ist schon lange geklärt:

http://www.delphipraxis.net/379996-post10.html
http://www.delphipraxis.net/1164057-post17.html

himitsu versucht immer, eine "abschliessende 0" ins Spiel zu bringen, wo keine ist...

himitsu 29. Apr 2012 10:17

AW: StrLCopy : Non VCL
 
z.B. #13, #15 und MSDN-Library durchsuchenlstrcpyn haben nunmal diese #0 am Ende.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.

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