AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Verknüpfung mit WinApi ?

Ein Thema von Nedo · begonnen am 23. Sep 2014 · letzter Beitrag vom 24. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2   
Nedo

Registriert seit: 8. Sep 2014
Ort: Osnabrück
16 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Verknüpfung mit WinApi ?

  Alt 23. Sep 2014, 15:31
Moin Moin

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. 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 und ich könnte es auf andere dinge ableiten.

Danke im voraus
euer Nedo
Lukas
Erst denken dann fragen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Verknüpfung mit WinApi ?

  Alt 23. Sep 2014, 15:40
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);
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (23. Sep 2014 um 16:03 Uhr)
  Mit Zitat antworten Zitat
-=ZGD=-

Registriert seit: 25. Apr 2006
Ort: Bad Aibling
105 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Verknüpfung mit WinApi ?

  Alt 23. Sep 2014, 15:45
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;
Stefan Michalk
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Verknüpfung mit WinApi ?

  Alt 23. Sep 2014, 16:06
Könnte man, aber muss man bei der Übergabe von Stringkonstanten nicht.
Der Compiler castet/wandelt das intern implizit um.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Verknüpfung mit WinApi ?

  Alt 23. Sep 2014, 16:14
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Nedo

Registriert seit: 8. Sep 2014
Ort: Osnabrück
16 Beiträge
 
Delphi 10 Seattle Professional
 
#6

AW: Verknüpfung mit WinApi ?

  Alt 23. Sep 2014, 16:32
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.
Lukas
Erst denken dann fragen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Verknüpfung mit WinApi ?

  Alt 23. Sep 2014, 16:35
Wie oben schon mehrfach steht: Du musst deine Strings einfach auf PChar/PWideChar casten.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Verknüpfung mit WinApi ?

  Alt 23. Sep 2014, 21:37
Er meint, du sollst das einfach so machen:

CreateSymbolicLink(pchar(m_sDirchangeFile), pchar(...und die andere var...), 0);
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Nedo

Registriert seit: 8. Sep 2014
Ort: Osnabrück
16 Beiträge
 
Delphi 10 Seattle Professional
 
#9

AW: Verknüpfung mit WinApi ?

  Alt 24. Sep 2014, 09:14
Also ich habe es jetzt mal fertig geschrieben. Es enstehen keine Fehler ... ABER es ensteht keine Verknüpfung meiner Datei.

Aber Warum ???

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.
Lukas
Erst denken dann fragen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Verknüpfung mit WinApi ?

  Alt 24. Sep 2014, 09:25
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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