![]() |
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 ![]() 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 |
AW: Verknüpfung mit WinApi ?
Hallo,
PChar/PWideChars sind quasi nur Strings.
Delphi-Quellcode:
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:
procedure TForm3.Button1Click(Sender: TObject);
begin CreateSymbolicLink('C:\Users\Benutzer\Desktop\Testlink.png', 'C:\Users\Benutzer\Pictures\Bild.png', 0); end;
Delphi-Quellcode:
Geht natürlich auch mit statischen Arrays, nur dass du da natürlich kein SetLength benutzen kannst.
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; 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:
2)
// Buffer nachträglich auf tatsächliche Länge setzen der über den Var-Parameter BufferSize zurückkommt
ApiAufruf(@Buffer[0], BufferSize); SetLength(Buffer, BufferSize);
Delphi-Quellcode:
3)
// Buffer nachträglich auf tatsächliche Länge setzen der über den Rückgabewert zurückkommt
RealBufferSize := ApiAufruf(@Buffer[0], BufferSize); SetLength(Buffer, RealBufferSize);
Delphi-Quellcode:
// 2 Aufrufe der API. Erst BufferSize abfragen, dann eigentlichen Aufruf machen
ApiAufruf(nil, RealBufferSize); SetLength(Buffer, RealBufferSize); ApiAufruf(@Buffer[0], RealBufferSize); |
AW: Verknüpfung mit WinApi ?
Zitat:
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; |
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. |
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.
|
AW: Verknüpfung mit WinApi ?
Zitat:
ich habe also ein TOpenDialog wo ich einen Pfad ermittle
Delphi-Quellcode:
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.
if dlgOpen.Execute() then begin //Dialog aufrufen
m_sDirchangeFile := dlgOpen.FileName; //Pfadname in VAR schreiben 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. |
AW: Verknüpfung mit WinApi ?
Wie oben schon mehrfach steht: Du musst deine Strings einfach auf PChar/PWideChar casten.
|
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);
|
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. |
AW: Verknüpfung mit WinApi ?
Delphi-Quellcode:
Was sagt er? Ich vermute fehlende Rechte, wie schon weiter oben erwähnt.
if not CreateSymbolicLink(pchar(m_SDirOutput), pchar(m_SDirLink), 0) then
MessageBox(0, PChar(SysErrorMessage(GetLastError)), nil, MB_OK or MB_ICONERROR); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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 by Thomas Breitkreuz