Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Verknüpfung mit WinApi ? (https://www.delphipraxis.net/181993-verknuepfung-mit-winapi.html)

Nedo 23. Sep 2014 15:31

Verknüpfung mit WinApi ?
 
Moin Moin :hi:

Ich habe mich ein wenig mit der WINAPI befasst und einiege sinnvolle Sachen gefunden z.B CreateSymbolicLink function http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Ich komme aber überhaupt nicht klar mit diesem ganzen PWideChare gedöns.:gruebel: Kann mir jemand ein einfaches Beispiel geben, in dem man einen Ausgabe Button hat (wo die Verknüpfung hin soll) und einen Button wo man auswählen kann von was die Verknüpfung erstellt werden soll ?



Das würde mir extrem helfen :coder2: und ich könnte es auf andere dinge ableiten.

Danke im voraus
euer Nedo

Neutral General 23. Sep 2014 15:40

AW: Verknüpfung mit WinApi ?
 
Hallo,

PChar/PWideChars sind quasi nur Strings.

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin
  CreateSymbolicLink('C:\Users\Benutzer\Desktop\Testlink.png', 'C:\Users\Benutzer\Pictures\Bild.png', 0);
end;
Das erzeugt eine Verknüpfung namens "Testlink.png" zur Datei "C:\Users\Benutzer\Pictures\Bild.png" auf dem Desktop. Falls du String-Variablen hast reicht normalerweise ein einfacher Cast auf PChar. Etwas komplizierter ist wenn die API dir einen String über einen PChar zurückgeben will:

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var Buffer: String;
    BufferArr: Array of Char;
    BuffSize: Cardinal;
begin
  BuffSize := 200; // Wir reservieren für die API 200 Zeichen

  // Per String
  SetLength(Buffer, BuffSize); // Speicher für 200 Zeichen reservieren
  GetUserName(@Buffer[1], BuffSize); // Der API wird der Pointer auf den Buffer und die Größe übergeben
  // Die API gibt in dem Fall über die BuffSize Variable die tatsächliche Länge des Benutzernamens zurück
  // Wir kürzen unseren String nun auf diese Länge
  SetLength(Buffer, BuffSize);
  // Fertig
  Caption := Buffer;

  // Per Char-Array
  SetLength(BufferArr, BuffSize);
  GetUserName(@BufferArr[0], BuffSize);
  SetLength(BufferArr, BuffSize);

  Caption := String(PChar(@BufferArr[0]));
end;
Geht natürlich auch mit statischen Arrays, nur dass du da natürlich kein SetLength benutzen kannst.

Wenn du das da oben verstanden hast und mal ein paar APIs aufgerufen hast bekommst du ein Gefühl dafür.
Das wichtige ist, dass du oft Speicher für die API reservieren musst wie oben bei GetUsername. Wenn du den String "Buffer" übergibst ohne vorher mit SetLength den Speicher zu reservieren dann fliegt dir dein Programm um die Ohren.

Wie viel Speicher man im voraus reservieren sollte steht entweder auf MSDN oder man muss halt überlegen was man so von der API erwartet und einfach mal großzügig reservieren.
Meistens erhält man über einen Var-Parameter wie bei GetUsername oder über das Ergebnis der Funktion die tatsächlich von Windows gebrauchte/genutzte Größe.

Mir fallen grad 3 häufige Arten ein:

1)
Delphi-Quellcode:
// Buffer nachträglich auf tatsächliche Länge setzen der über den Var-Parameter BufferSize zurückkommt
ApiAufruf(@Buffer[0], BufferSize);
SetLength(Buffer, BufferSize);
2)
Delphi-Quellcode:
// Buffer nachträglich auf tatsächliche Länge setzen der über den Rückgabewert zurückkommt
RealBufferSize := ApiAufruf(@Buffer[0], BufferSize);
SetLength(Buffer, RealBufferSize);
3)
Delphi-Quellcode:
// 2 Aufrufe der API. Erst BufferSize abfragen, dann eigentlichen Aufruf machen
ApiAufruf(nil, RealBufferSize);
SetLength(Buffer, RealBufferSize);
ApiAufruf(@Buffer[0], RealBufferSize);

-=ZGD=- 23. Sep 2014 15:45

AW: Verknüpfung mit WinApi ?
 
Zitat:

Zitat von Neutral General (Beitrag 1273498)
Hallo,

PChar/PWideChars sind quasi nur Strings.

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin
  CreateSymbolicLink('C:\Users\Benutzer\Desktop\Testlink.png', 'C:\Users\Benutzer\Pictures\Bild.png', 0);
end;
Das erzeugt eine Verknüpfung namens "Testlink.png" zur Datei "C:\Users\Benutzer\Pictures\Bild.png" auf dem Desktop.

Wobei man natürlich casten könnte, da quasi "nur" Strings UTF-8 sind..


Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin
  CreateSymbolicLink(pchar('C:\Users\Benutzer\Desktop\Testlink.png'), pchar('C:\Users\Benutzer\Pictures\Bild.png'), 0);
end;

Neutral General 23. Sep 2014 16:06

AW: Verknüpfung mit WinApi ?
 
Könnte man, aber muss man bei der Übergabe von Stringkonstanten nicht.
Der Compiler castet/wandelt das intern implizit um.

DeddyH 23. Sep 2014 16:14

AW: Verknüpfung mit WinApi ?
 
Hier Konstanten zu verwenden macht aber wenig Sinn, von daher ist der Cast-Hinweis schon berechtigt ;). Allerdings sollte man bei dieser speziellen Funktion die Hinweise auf der MS-Seite beachten, ein kurzer Test auf meinem Rechner ging nämlich schief, weil mir als Normalbenutzer die Rechte fehlen.

Nedo 23. Sep 2014 16:32

AW: Verknüpfung mit WinApi ?
 
Zitat:

Zitat von Neutral General (Beitrag 1273498)
Hallo,

PChar/PWideChars sind quasi nur Strings.

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin
  CreateSymbolicLink('C:\Users\Benutzer\Desktop\Testlink.png', 'C:\Users\Benutzer\Pictures\Bild.png', 0);
end;
Das erzeugt eine Verknüpfung namens "Testlink.png" zur Datei "C:\Users\Benutzer\Pictures\Bild.png" auf dem Desktop. Falls du String-Variablen hast reicht normalerweise ein einfacher Cast auf PChar.

Danke für diese Blitzschnelle Antwort. Ich möchte dies jetzt in mein Programm einbauen:

ich habe also ein TOpenDialog wo ich einen Pfad ermittle
Delphi-Quellcode:
if dlgOpen.Execute() then begin //Dialog aufrufen
m_sDirchangeFile := dlgOpen.FileName;  //Pfadname in VAR schreiben
Diese Aktion habe ich für zwei Buttons um einmal fest zu legen von welcher Datei ich die Verk. bilden will und wo diese hin soll.
Nun habe ich diese Pfade in 2 String var´s und muss diese nur noch für 'C:\Users\Benutzer\Desktop\Testlink.png', 'C:\Users\Benutzer\Pictures\Bild.png' ersetzen... und hier kommt der PWideChar Fehler dar ich ja einen string in den Var´s stehen habe.

Neutral General 23. Sep 2014 16:35

AW: Verknüpfung mit WinApi ?
 
Wie oben schon mehrfach steht: Du musst deine Strings einfach auf PChar/PWideChar casten.

lbccaleb 23. Sep 2014 21:37

AW: Verknüpfung mit WinApi ?
 
Er meint, du sollst das einfach so machen:

Delphi-Quellcode:
CreateSymbolicLink(pchar(m_sDirchangeFile), pchar(...und die andere var...), 0);

Nedo 24. Sep 2014 09:14

AW: Verknüpfung mit WinApi ?
 
Also ich habe es jetzt mal fertig geschrieben. Es enstehen keine Fehler :-D ... ABER es ensteht keine Verknüpfung meiner Datei.

Aber Warum ??? :cry:

Delphi-Quellcode:
unit Testen;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IniFiles, Filectrl, ShellApi;

type
  TForm2 = class(TForm)
    btnLink: TButton;
    btnOutput: TButton;
    dlgOpen: TOpenDialog;
    procedure btnLinkClick(Sender: TObject);
    procedure btnOutputClick(Sender: TObject);
  private
    m_SDirOutput : String;
    m_SDirLink : String;
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}
{*******************************************************************************
  Procedure: btnMoveClick
  Author:   l
  Date:     24.09.2014 08:32:10      Since Version:  1.0.0.0
  Throws:
  Info:     Ziel wählen, Ziel wir in Ausgabeortner gebildet
*******************************************************************************}
procedure TForm2.btnLinkClick(Sender: TObject);
var
LinkName : String;
begin
    dlgOpen.Execute();
    m_SDirLink := dlgOpen.FileName;
    LinkName := m_SDirLink.Substring(m_SDirLink.LastIndexOf('\'));
    m_SDirOutput := m_SDirOutput + LinkName;
    CreateSymbolicLink(pchar(m_SDirOutput), pchar(m_SDirLink), 0);
end;

{*******************************************************************************
  Procedure: btnOutputClick
  Author:   l
  Date:     24.09.2014 08:40:50      Since Version:  1.0.0.0
  Throws:
  Info:     Ausgabeortner wählen
*******************************************************************************}
procedure TForm2.btnOutputClick(Sender: TObject);
begin
    SelectDirectory('Ortner wählen', '', m_SDirOutput);
end;

end.

DeddyH 24. Sep 2014 09:25

AW: Verknüpfung mit WinApi ?
 
Delphi-Quellcode:
if not CreateSymbolicLink(pchar(m_SDirOutput), pchar(m_SDirLink), 0) then
  MessageBox(0, PChar(SysErrorMessage(GetLastError)), nil, MB_OK or MB_ICONERROR);
Was sagt er? Ich vermute fehlende Rechte, wie schon weiter oben erwähnt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 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