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 Geolocation Windows API (https://www.delphipraxis.net/211230-geolocation-windows-api.html)

dtpfl 18. Aug 2022 17:45

Geolocation Windows API
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,

ich werde verrückt, ich versuche über die Windows API den Standort zu bekommen, da TLocationSensor nicht (mehr) funktioniert. https://quality.embarcadero.com/browse/RSP-38580
Dafür will ich https://docs.microsoft.com/de-DE/uwp...ew=winrt-22621 benutzen, es gibt dies sogar schon in Delphi Winapi.Devices.Geolocation.

Ich habe ein C# Beispielprojekt kompiliert hier funktioniert es einwandfrei (https://github.com/microsoft/Windows...sition.xaml.cs)
Code:
var accessStatus = await Geolocator.RequestAccessAsync();

            switch (accessStatus)
            {
                case GeolocationAccessStatus.Allowed:

                    _geolocator = new Geolocator { ReportInterval = 2000 };
                    _geolocator.PositionChanged += OnPositionChanged;
                    _geolocator.StatusChanged += OnStatusChanged;
                    break;
Nun bekomme ich einen Fehler dass die Schnittstelle nicht unterstützt wird, jetzt bin ich komplett gebrochen... :lol:
Hier ist ein Ausschnitt meines Codes (der Rest ist im Anhang)t:
Code:
procedure statusCompletedAccess(asyncInfo: IAsyncOperation_1__GeolocationAccessStatus; asyncStatus: AsyncStatus);

TAccessStatusCompletedHandlerCompleted = procedure(asyncInfo: IAsyncOperation_1__GeolocationAccessStatus; asyncStatus: AsyncStatus) of object;

type TAccessStatusCompletedHandler = class(TInspectableObject, AsyncOperationCompletedHandler_1__GeolocationAccessStatus)
  private
    FEvent: TAccessStatusCompletedHandlerCompleted;
  public
    procedure Invoke(asyncInfo: IAsyncOperation_1__GeolocationAccessStatus; asyncStatus: AsyncStatus); safecall;
    constructor Create(AEvent: TAccessStatusCompletedHandlerCompleted);
  end;

constructor TAccessStatusCompletedHandler.Create(
  AEvent: TAccessStatusCompletedHandlerCompleted);
begin
  FEvent := AEvent;
end;

procedure TAccessStatusCompletedHandler.Invoke(
  asyncInfo: IAsyncOperation_1__GeolocationAccessStatus;
  asyncStatus: AsyncStatus);
begin
  FEvent(asyncInfo, asyncStatus);
end;

procedure TForm9.statusCompletedAccess(
  asyncInfo: IAsyncOperation_1__GeolocationAccessStatus;
  asyncStatus: AsyncStatus);
begin
  ShowMessage('JAA!!!');
end;
Gibt es hierfür eine Lösung oder eine gute alternative zu TLocationSensor um durchgehend den Standort ermitteln zu können? Dies muss unter Windows und auch Offline (GPS) funktionieren!

Falls dies aufwendiger ist und jemand das Interesse hat mir dabei zu helfen, könnte ich evtl. meinen Arbeitgeber fragen ob dieser dann auch "entschädigt" wird :D
Testprojekt im Anhang.

Mantrid 21. Aug 2022 03:23

AW: Geolocation Windows API
 
Zitat:

Zitat von dtpfl (Beitrag 1510276)
Ich habe ein C# Beispielprojekt kompiliert hier funktioniert es einwandfrei (https://github.com/microsoft/Windows...sition.xaml.cs)

Kopier mal den reinen Sourcecode in ein neues Projekt mit neuem XAML und neuem Manifest.

Funktioniert dann das C# Projekt noch?

Bei Microsoft Projekten ist teilweise im Manifest ein generisches Zertifikat für höhere Benutzerrechte vorhanden.

Bei Einträgen wie
Zitat:

<Identity Name="Microsoft.SDKSamples.Geolocation.CS" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="1.0.0.0" />
<mp: PhoneIdentity PhoneProductId="38c64b46-d8e6-4583-8e8d-eef8feb28c08" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
bin ich immer vorsichtig, ob das Beispiel nicht seitens Microsoft mit anderen Systemparamentern gestartet wird.

Zitat:

Gibt es hierfür eine Lösung oder eine gute alternative zu TLocationSensor um durchgehend den Standort ermitteln zu können? Dies muss unter Windows und auch Offline (GPS) funktionieren!
Geolokation ohne GPS? Irgendwo im Wald, am besten noch ohne Mobilfunk?
Also mit elektronischem Kompass hat man da nur eine rudimentäre Lokalisation.
Was soll damit erzielt werden? Geo Lock für Softwareverwendung? Da gibts kommerzielle Lösungen, die per DLL eingebunden werden können.

Zitat:

Falls dies aufwendiger ist und jemand das Interesse hat mir dabei zu helfen, könnte ich evtl. meinen Arbeitgeber fragen ob dieser dann auch "entschädigt" wird
Testprojekt im Anhang.
Wenn das Projekt interessant ist, frage ich meinen Arbeitgeber was er davon hält. Dann wird er es wahrscheinlich von deinem Arbeitgeber abkaufen und mir eine Provision vom Gewinn geben. :)

KodeZwerg 21. Aug 2022 07:34

AW: Geolocation Windows API
 
Ich würde es per HTML5 realisieren, benötigt keine kommerzielle Dll und auch nichts von Microsoft :D

TurboMagic 21. Aug 2022 07:59

AW: Geolocation Windows API
 
Geolocation ohne GPS funktioniert meist so, dass irgendwelche Anbieter W-Lan Router/AP Standorte
erfasst haben und durch die Info welche man gerade "empfängt"/"sieht" man einen ungefähren
Standort ermitteln kann, wenn man genügend von denen die in der DB sind gleichzeitig sieht und
eine Internetverbindung hat um diese DB abfragen zu können.

Vermutlich macht das Geolocation API genau sowas im Hintergrund, wenn kein GPS vorhanden ist.
Und nein, da sollte man kein HTML5 dafür brauchen. Dann wäre man ja wieder vom Browser und dessen
Umsetzung abhängig, was auch nicht besser wäre.

dtpfl 23. Aug 2022 15:16

AW: Geolocation Windows API
 
Danke für die umfangreichen & hilfreichen Antworten!
Da habe ich mich evtl. falsch ausgedrückt, natürlich sollte hauptsächlich der GPS-Sensor benutzt werden, wünschenswert wäre falls GPS mal nicht verfügbar ist sollte der Standort aus z.B. WLAN oder IP herkommen, wie die Windows-API es macht.

Zitat:

Wenn das Projekt interessant ist, frage ich meinen Arbeitgeber was er davon hält. Dann wird er es wahrscheinlich von deinem Arbeitgeber abkaufen und mir eine Provision vom Gewinn geben. :)
Ich melde mich mal die Tage.

Mantrid 24. Aug 2022 07:03

AW: Geolocation Windows API
 
Zitat:

Zitat von dtpfl (Beitrag 1510542)
Ich melde mich mal die Tage.

Muss nicht sein.

Im Moment interessieren uns nur ERP Programme, die wir bei unseren Kunden verwenden könnten. Für alles andere wird derzeit kein Auftrag angenommen.

TiGü 24. Aug 2022 07:54

AW: Geolocation Windows API
 
Bitte sehr:
Delphi-Quellcode:
type
    TAccessStatusCompletedHandler = class(TInspectableObject,
        AsyncOperationCompletedHandler_1__GeolocationAccessStatus_Delegate_Base,
        AsyncOperationCompletedHandler_1__GeolocationAccessStatus)
    private
        FEvent: TAccessStatusCompletedHandlerCompleted;
    public
        procedure Invoke(asyncInfo: IAsyncOperation_1__GeolocationAccessStatus; asyncStatus: AsyncStatus); safecall;
        constructor Create(AEvent: TAccessStatusCompletedHandlerCompleted);
    end;
Beim Debuggen der Zuweisung
Delphi-Quellcode:
AsyncOperation.Completed := CompletedHandler;
kommt man in
Delphi-Quellcode:
TInterfacedObject.QueryInterface
raus:
Code:
System.TInterfacedObject.QueryInterface((4082257043, 58823, 23432, (190, 219, 211, 230, 55, 207, 242, 113)),(no value))
:76d2de72 combase.RoGetAgileReference + 0x62
:77b6272b ; C:\Windows\SysWOW64\Geolocation.dll
:77b742e1 ; C:\Windows\SysWOW64\Geolocation.dll
:77b7637d ; C:\Windows\SysWOW64\Geolocation.dll
Unit9.TForm9.Button3Click($43A6380)
Hier wird nach der
Delphi-Quellcode:
IID = (4082257043, 58823, 23432, (190, 219, 211, 230, 55, 207, 242, 113))
gefragt, was als bekannte Hex(-String) Darstellung dem hier entspricht:
Delphi-Quellcode:
'{F3524C93-E5C7-5B88-BEDB-D3E637CFF271}'
.
Das wiederrum ist in Winapi.Devices.Geolocation das Interface
Delphi-Quellcode:
AsyncOperationCompletedHandler_1__GeolocationAccessStatus_Delegate_Base
.

Lessons Learned:
1. Debug-DCU einschalten.
2. Trace into (F7) Debugging nutzen.
3. Bei (COM-)Interface-Geschichten im Zweifelsfall ruhig auch das Eltern-Interface mit in die Klasse ziehen, auch wenn keine Methoden darin definiert sind.

dtpfl 24. Aug 2022 20:11

AW: Geolocation Windows API
 
Zitat:

Zitat von TiGü (Beitrag 1510567)
Bitte sehr:
Delphi-Quellcode:
type
    TAccessStatusCompletedHandler = class(TInspectableObject,
        AsyncOperationCompletedHandler_1__GeolocationAccessStatus_Delegate_Base,
        AsyncOperationCompletedHandler_1__GeolocationAccessStatus)
    private
        FEvent: TAccessStatusCompletedHandlerCompleted;
    public
        procedure Invoke(asyncInfo: IAsyncOperation_1__GeolocationAccessStatus; asyncStatus: AsyncStatus); safecall;
        constructor Create(AEvent: TAccessStatusCompletedHandlerCompleted);
    end;
Beim Debuggen der Zuweisung
Delphi-Quellcode:
AsyncOperation.Completed := CompletedHandler;
kommt man in
Delphi-Quellcode:
TInterfacedObject.QueryInterface
raus:
Code:
System.TInterfacedObject.QueryInterface((4082257043, 58823, 23432, (190, 219, 211, 230, 55, 207, 242, 113)),(no value))
:76d2de72 combase.RoGetAgileReference + 0x62
:77b6272b ; C:\Windows\SysWOW64\Geolocation.dll
:77b742e1 ; C:\Windows\SysWOW64\Geolocation.dll
:77b7637d ; C:\Windows\SysWOW64\Geolocation.dll
Unit9.TForm9.Button3Click($43A6380)
Hier wird nach der
Delphi-Quellcode:
IID = (4082257043, 58823, 23432, (190, 219, 211, 230, 55, 207, 242, 113))
gefragt, was als bekannte Hex(-String) Darstellung dem hier entspricht:
Delphi-Quellcode:
'{F3524C93-E5C7-5B88-BEDB-D3E637CFF271}'
.
Das wiederrum ist in Winapi.Devices.Geolocation das Interface
Delphi-Quellcode:
AsyncOperationCompletedHandler_1__GeolocationAccessStatus_Delegate_Base
.

Lessons Learned:
1. Debug-DCU einschalten.
2. Trace into (F7) Debugging nutzen.
3. Bei (COM-)Interface-Geschichten im Zweifelsfall ruhig auch das Eltern-Interface mit in die Klasse ziehen, auch wenn keine Methoden darin definiert sind.

Oh wow vielen Dank! So tief war ich noch nie im Debuggen.
Ich krieg zwar keinen Dialog wo man nach der Erlaubnis gefragt wird, aber das denke ich liegt daran dass VCL keine WINUI oder UWP ist.
Ich schau mal was ich hier machen kann.

Btw. wo enable ich Debug-DCU?

TurboMagic 24. Aug 2022 20:19

AW: Geolocation Windows API
 
Debug DCUs: Projekt/Optionen/Erzeugen/Delphi-Compiler/Compilieren/Mit Debug DCUs

dtpfl 25. Aug 2022 15:00

AW: Geolocation Windows API
 
Zitat:

IID = (4082257043, 58823, 23432, (190, 219, 211, 230, 55, 207, 242, 113)) gefragt, was als bekannte Hex(-String)
Wie kommst du von diesem Wert zu diesem Hex(-String)? Was wäre hier die einfachste Möglichkeit?

KodeZwerg 25. Aug 2022 15:51

AW: Geolocation Windows API
 
Zitat:

Zitat von dtpfl (Beitrag 1510708)
Zitat:

IID = (4082257043, 58823, 23432, (190, 219, 211, 230, 55, 207, 242, 113)) gefragt, was als bekannte Hex(-String)
Wie kommst du von diesem Wert zu diesem Hex(-String)? Was wäre hier die einfachste Möglichkeit?

Vielleicht so?
Delphi-Quellcode:
  function ToIID(A: Cardinal; B, C: Word; D, E, F, G, H, I, J, K: Byte): string;
  begin
    Result := '{' + IntToHex(A) + '-' + IntToHex(B) + '-' + IntToHex(C) + '-' +
              IntToHex(D) + IntToHex(E) + '-' + IntToHex(F) + IntToHex(G) +
              IntToHex(H) + IntToHex(I) + IntToHex(J) + IntToHex(K) + '}';
  end;
var
  s: string;
begin
  s := ToIID(4082257043, 58823, 23432, 190, 219, 211, 230, 55, 207, 242, 113);
  ShowMessage(s);
end;

himitsu 25. Aug 2022 17:12

AW: Geolocation Windows API
 
ID.ToString Delphi-Referenz durchsuchenTGuidHelper.ToString :stupid:


Zitat:

Zitat von dtpfl (Beitrag 1510596)
aber das denke ich liegt daran dass VCL keine WINUI oder UWP ist.

Das kann man so nicht mehr so einfach sagen.

Ich weiß jetzt nicht, wie es bei dieser Komponente aussieht, aber viele neue Komponenten, im Delphi, greifen intern auf die API der UWP zu, auch wenn du für Win32 (32 oder 64 Bit) kompiliert hast.
Wenn ich mich recht erinnere, z.B. bei den Bluetooth-Komponenten.

Zitat:

Zitat von dtpfl (Beitrag 1510596)
Btw. wo enable ich Debug-DCU?

Projekt-Optionen > Delphi-Compiler -> Compilieren

KodeZwerg 25. Aug 2022 23:22

AW: Geolocation Windows API
 
Zitat:

Zitat von himitsu (Beitrag 1510716)
ID.ToString Delphi-Referenz durchsuchenTGuidHelper.ToString :stupid:

Wie wendet man das an um aus "IID = (4082257043, 58823, 23432, (190, 219, 211, 230, 55, 207, 242, 113))" das zu machen "{F3524C93-E5C7-5B88-BEDB-D3E637CFF271}" ?

himitsu 25. Aug 2022 23:52

AW: Geolocation Windows API
 
Du nimmst eine Variable von Typ Delphi-Referenz durchsuchenTGUID, füllst deren Felder und dann ...
:angle2:

KodeZwerg 26. Aug 2022 00:38

AW: Geolocation Windows API
 
Zitat:

Zitat von himitsu (Beitrag 1510739)
füllst deren Felder

Das hatte bei mir zu keinem brauchbaren Ergebnis geführt, da kamen mehr nullen zustande als alles andere :oops: da kenne ich mich nicht gut genug mit aus

shebang 26. Aug 2022 08:09

AW: Geolocation Windows API
 
Delphi-Quellcode:
var guid : TGUID;
guid.D1    := 4082257043;
guid.D2    := 58823;
guid.D3    := 23432;
guid.D4[0] := 190;
guid.D4[1] := 219;
guid.D4[2] := 211;
guid.D4[3] := 230;
guid.D4[4] := 55;
guid.D4[5] := 207;
guid.D4[6] := 242;
guid.D4[7] := 113;
ShowMessage(guid.tostring);

himitsu 26. Aug 2022 09:32

AW: Geolocation Windows API
 
Oder ein TGUID.Create mit den binären Daten.

k.A. warum es keine Variante mit den Feld-Parametern gibt
oder der String-Variante.

wobei der Compiler den String
Delphi-Quellcode:
'{...}'
kennt und man es dort einfach mit
Delphi-Quellcode:
:=
machen kann.

KodeZwerg 26. Aug 2022 10:01

AW: Geolocation Windows API
 
Danke für die Einweisung @SheBang, das funzt :-D

Zitat:

Zitat von himitsu (Beitrag 1510754)
Oder ein TGUID.Create mit den binären Daten.

Genau das hatte ich gestern probiert bevor ich meine mini Methode schrieb, könntest du so nett sein und mal zeigen wie man es korrekt aufruft bitte?

TiGü 26. Aug 2022 10:57

AW: Geolocation Windows API
 
Zitat:

Zitat von dtpfl (Beitrag 1510708)
Zitat:

IID = (4082257043, 58823, 23432, (190, 219, 211, 230, 55, 207, 242, 113)) gefragt, was als bekannte Hex(-String)
Wie kommst du von diesem Wert zu diesem Hex(-String)? Was wäre hier die einfachste Möglichkeit?

Kopfrechnen? 8-)

Nur Spaß, mit ein-zwei Zeilen bist du dabei (siehe auch vorige Antworten):

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
    IID: TGUID;

begin
  try
    IID := TGUID.Create(4082257043, 58823, 23432, 190, 219, 211, 230, 55, 207, 242, 113);
    Writeln(IID.ToString)
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Das verwendet dann den TGUIDHelper aus System.SysUtils (nein, ich weiß nicht seit wann das drin ist, bitte fragt nicht):
Delphi-Quellcode:
class function TGUIDHelper.Create(A: Cardinal; B, C: Word; D, E, F, G, H, I, J, K: Byte): TGUID;
begin
  Result.D1 := UInt32(A);
  Result.D2 := Word(B);
  Result.D3 := Word(C);
  Result.D4[0] := D;
  Result.D4[1] := E;
  Result.D4[2] := F;
  Result.D4[3] := G;
  Result.D4[4] := H;
  Result.D4[5] := I;
  Result.D4[6] := J;
  Result.D4[7] := K;
end;

himitsu 26. Aug 2022 12:01

AW: Geolocation Windows API
 
Delphi-Quellcode:
procedure guidtest(guid: TGUID);
begin
end;

const
  myguid: TGUID = '{F3524C93-E5C7-5B88-BEDB-D3E637CFF271}'; // hier geht es, unten nicht :(

procedure TForm21.FormCreate(Sender: TObject);
var
  guid: TGUID;
  bytes: TBytes;
begin
  guid := TGUID.Create('{F3524C93-E5C7-5B88-BEDB-D3E637CFF271}');
  //guid := '{F3524C93-E5C7-5B88-BEDB-D3E637CFF271}';
  guid := myguid; // komisch da geht es, warum nicht auch das davor?
  //guidtest('{F3524C93-E5C7-5B88-BEDB-D3E637CFF271}'); geht auch nicht
  guidtest(TGUID.Create('{F3524C93-E5C7-5B88-BEDB-D3E637CFF271}'));

  // den hatte ich auf die Schnelle übersehn .. dachte ihn gibt es (noch) nicht
  guid := TGUID.Create(4082257043, 58823, 23432, 190, 219, 211, 230, 55, 207, 242, 113);

  // mit der ByteOrder bin ich mir grade nicht sicher ... kann sein (wird aber bestimmt so sein), das man die ersten LongWord/Word umdrehen muß.
  bytes := [243, 82, 76, 147, {} 229, 199, {} 91, 136, {} 190, 219, 211, 230, 55, 207, 242, 113];
  guid := TGUID.Create(bytes); // als Array
  guid := TGUID.Create(bytes[0]); // als "irgendwelche" binäre Daten (Zeiger) -> TGUIDHelper.Create(const Data; DataEndian: TEndian=TEndian.Little)
end;


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