AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Bluetooth API (JwaBluetoothAPIs) Problem erhalte immer 0
Thema durchsuchen
Ansicht
Themen-Optionen

Bluetooth API (JwaBluetoothAPIs) Problem erhalte immer 0

Ein Thema von CTV · begonnen am 25. Jan 2006 · letzter Beitrag vom 17. Feb 2006
Antwort Antwort
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#1

Bluetooth API (JwaBluetoothAPIs) Problem erhalte immer 0

  Alt 25. Jan 2006, 18:53
Ich möchte ein tool coden welches anhand der Qualität der Verbindung von Hany zu PC bei abnehmender Qualität des Signales den pc lockt. Dies über Bluetooth, damit soll erreicht werden, dass wenn ich mich mit meinem Handy vom PC entferne dass der automatisch glockt wird.

Ich hab diese API gefunden welche ich nun anzuwenden versuche:
JwaBluetoothAPIs

Mein Problem ist nun dass es mir irgendwie immer falsche werte zurück liefert ich habe in erster Lienie mal versucht überhaupt Informationen eines Bluetooth Geräts welches in der nähe ist zu bekommen. und zwar so:

Delphi-Quellcode:
function HexB(b: Byte): string;
const
  HexChar: array[0..15] of char = '0123456789ABCDEF';
begin
  HexB := HexChar[b shr 4] + HexChar[b and $0F];
end;

function btadresstostr(adr:_BLUETOOTH_ADDRESS):string;
var i:integer;
begin
  result:='';
  for i:=0 to 4 do
  begin
    result:=result+HexB(adr.rgBytes[i])+':';
  end;
  result:=result+HexB(adr.rgBytes[5]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    pbtsp: BLUETOOTH_DEVICE_SEARCH_PARAMS;
    pbtdi:BLUETOOTH_DEVICE_INFO;
    r:HBLUETOOTH_DEVICE_FIND;
begin
   r:= BluetoothFindFirstDevice(pbtsp,pbtdi);
   showmessage(btadresstostr(pbtdi.address));
   showmessage(pbtdi.szName);
   showmessage(inttostr(pbtdi.Address.ullLong));

end;
pbtdi.address enthält die MAC adresse in eimem array of byte diesen teil konvertiere ich wider zu hex um

ich kriebe werte jedoch stimmen die nicht mit den wirklichen überein und jedes mal wenn ich neu compieliere erhalte ich wider andere werte ich vermute irgend was ist noch nicht iniialisiert hat jemand eine idee was ich noch machen muss damit es klappt?

danke für eure hilfe

greetz Cy
Wer glaub er ist, hört auf zu werden!
Delphi Rulez!!!
  Mit Zitat antworten Zitat
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#2

Re: Wo ist hier der Wurm drin??

  Alt 25. Jan 2006, 19:50
ich bin der Sache etwas näher gekommen in dem ich ein C programm umgeschrieben habe nun schauts so aus:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  //radio
  FirstRadio:PBlueToothFindRadioParams;
  RadioHandle:THANDLE ;
  NextRadio:THANDLE;
  FoundNextRadioHandle:BOOL;
  RadioDeviceInfo:BLUETOOTH_RADIO_INFO;
  dw:DWORD;
  //device
  DeviceHandle:HBLUETOOTH_DEVICE_FIND;
  DeviceInfo:BLUETOOTH_DEVICE_INFO;
  SearchParams:BLUETOOTH_DEVICE_SEARCH_PARAMS;
  FoundDevice:BOOL;
  FoundDeviceInfo:BLUETOOTH_DEVICE_INFO;
begin


BluetoothFindFirstRadio(FirstRadio,RadioHandle);
if(RadioHandle = NULL)then
begin
 showmessage('Problems Creating Radio Handle');
end;

FoundNextRadioHandle:= BluetoothFindNextRadio(RadioHandle,NextRadio);

if(FoundNextRadioHandle = TRUE)then
begin
 showmessage('Found Another Bluetooth Radio');
end
else
begin
 showmessage('Only One Bluetooth Radio Handle Present');
end;

BluetoothGetRadioInfo(RadioHandle,RadioDeviceInfo);
dw:= GetLastError();
showmessage(inttostr(dw));

SearchParams.dwSize:= sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
SearchParams.fReturnAuthenticated:= TRUE;
SearchParams.fReturnRemembered:= TRUE;
SearchParams.fReturnUnknown:= TRUE;
SearchParams.fReturnConnected:= TRUE;
SearchParams.fIssueInquiry:= TRUE;
SearchParams.cTimeoutMultiplier:= 10;
SearchParams.hRadio:= RadioHandle;

BluetoothFindFirstDevice(SearchParams,DeviceInfo);
showmessage(btadresstostr(DeviceInfo.Address));
showmessage(DeviceInfo.szName);
dw:= GetLastError();
showmessage(inttostr(dw));

FoundDevice:= BluetoothFindNextDevice(DeviceHandle,FoundDeviceInfo);
dw:= GetLastError();
showmessage(inttostr(dw));
end;
aber ich erhalte immer noch falsch werte hat jemand eine idee ?
danke für eure Hilfe

greetz Cy
Wer glaub er ist, hört auf zu werden!
Delphi Rulez!!!
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Wo ist hier der Wurm drin??

  Alt 25. Jan 2006, 20:12
Hallo CTV,

ändere bitte den Titel. Damit erhöhst du auch die Chance, dass zusätzliche User sich deines Problemes annehmen. Der Titel sollte aussagekräftig auf den Themenbereich bezeichnen, in dem das Problem liegt.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#4

Re: Bluetooth API (JwaBluetoothAPIs) Problem erhalte immer 0

  Alt 8. Feb 2006, 00:46
nun bin ich einen Schritt weiter: mein code sieht nun so aus:
Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var hRadio,hDeviceFind:THANDLE;
    hfind:HBLUETOOTH_RADIO_FIND;
    btfrp:PBlueToothFindRadioParams;
    radioInfo:BLUETOOTH_RADIO_INFO;
    deviceInfo:BLUETOOTH_DEVICE_INFO;
    deviceSearchParams:BLUETOOTH_DEVICE_SEARCH_PARAMS;
begin

   btfrp.dwSize:=sizeof(btfrp); //hier Problem

   hFind := BluetoothFindFirstRadio( btfrp, hRadio );
   showmessage(inttostr(sizeof(btfrp)));
   if (hFind > 0) then
   begin
     repeat
       begin
         radioInfo.dwSize:= sizeof(radioInfo);
           if (ERROR_SUCCESS = BluetoothGetRadioInfo(hRadio, radioInfo)) then
           begin
            memo1.Lines.Add('Radio: '+ radioInfo.szName)
           end
         else
         begin
           showmessage('error');
         end;
           deviceInfo.dwSize := sizeof(deviceInfo);
          // memset(&deviceSearchParams, 0, sizeof(deviceSearchParams));
           deviceSearchParams.dwSize := sizeof(deviceSearchParams);

           //deviceSearchParams.fReturnAuthenticated = true;
            deviceSearchParams.fReturnRemembered := true;
           //deviceSearchParams.fReturnUnknown = true;
           //deviceSearchParams.fReturnConnected = true;

           deviceSearchParams.hRadio := hRadio;

           hDeviceFind := BluetoothFindFirstDevice(deviceSearchParams, deviceInfo);

           if (hDeviceFind>0) then
           begin
           while(BluetoothFindNextDevice(hDeviceFind, deviceInfo)) do
           begin
             showmessage('Device: '+deviceInfo.szName);
                //BluetoothDisplayDeviceProperties(0, &deviceInfo);
           end;
              BluetoothFindDeviceClose(hDeviceFind);
           end;

           // if BluetoothGetDeviceInfo(hRadio, deviceInfo) then
           begin
           showmessage('Device: '+deviceInfo.szName);
              // BluetoothUpdateDeviceRecord - change name

              // BluetoothRemoveDevice
         end;
       end;
     until (BluetoothFindNextRadio( hFind, hRadio ) );
       end;
   BluetoothFindRadioClose( hFind );

end;
mein Problem ist folgendes und zwar die Zeile:
  btfrp.dwSize:=sizeof(btfrp); verursacht eine Zugriffsverletzung aber ich weiss nicht wieso

in der API ist folgender code aufgeführt nach welchem ich meinen nachgebaut habe:
[code]
// ************************************************** *************************
//
// Radio Enumeration
//
// Description:
// This group of APIs enumerates the installed Bluetooth radios.
//
// Sample Usage:
// HANDLE hRadio;
// BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(btfrp) };
//
// HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio( &btfrp, &hRadio );
// if ( NULL != hFind )
// {
// do
// {
// //
// // TODO: Do something with the radio handle.
// //
//
// CloseHandle( hRadio );
//
// } while( BluetoothFindNextRadio( hFind, &hRadio ) );
//
// BluetoothFindRadioClose( hFind );
// }
//
// ************************************************** *************************
[code]

und dort wird
BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(btfrp) };

direckt zugewisen was aber in delphi nicht möglich ist wenn ich das hier probiere:
    btfrp:=sizeof(btfrp); dann erhalte ich einen Fehler da die typen Integer und PBlueToothFindRadioParams nicht überein stimmen
ausser ich schreibe die Zahl 0 hin dann gehts. aber sizeof(btfrp) wenn ich mir das anzeigen lasse ist 4 und auch 4 kann ich nicht direckt zuweisen nur über das btfrp.dwsize:=4; ghets jedoch gibts dann zur laufzeit eine zugriffsverletzung.

hat jemand eine idee was das Problem ist?
ich währe sehr dankbar! das muss doch irgendwie gehen

Greetz Cy
Wer glaub er ist, hört auf zu werden!
Delphi Rulez!!!
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Bluetooth API (JwaBluetoothAPIs) Problem erhalte immer 0

  Alt 8. Feb 2006, 07:09
Zitat von CTV:
mein Problem ist folgendes und zwar die Zeile:
  btfrp.dwSize:=sizeof(btfrp); verursacht eine Zugriffsverletzung aber ich weiss nicht wieso
btfrp ist bei dir ein Zeiger, und zeigt wohl ins Nirvana. Ändere den Typ auf TBlueToothFindRadioParams.

Zitat von CTV:
und dort wird
BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(btfrp) };

direckt zugewisen was aber in delphi nicht möglich ist
Das ist keine Zuweisung sondern eine initialisierte Variable. Das kannst du in Delphi auf globaler Ebene auch schreiben:
Delphi-Quellcode:
var
  btfrp: TBlueToothFindRadioParams = (
    dwSize: SizeOf(TBlueToothFindRadioParams )
  );
Macht man aber normalerweise nicht so...
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#6

Re: Bluetooth API (JwaBluetoothAPIs) Problem erhalte immer 0

  Alt 8. Feb 2006, 10:33
Danke dir Flocke
ich habe das Problem lösen können habe aber schon wider ein neus:

Lösung des alten Problems:
die Deklaration sieht nun so aus:
Delphi-Quellcode:
var
  btfrp: _BLUETOOTH_FIND_RADIO_PARAMS = (
  dwSize: SizeOf(TBlueToothFindRadioParams ));
und die Zuweisung so:
Delphi-Quellcode:
  btfrp.dwSize:=sizeof(btfrp);
  hFind := BluetoothFindFirstRadio(@btfrp, hRadio );
BluetoothFindFirstRadio erwartet einen Pointer für btfrp dann habe ich einfach ein @ hingemacht

Neues Problem:
nun kann ichs starten und es kommt kein fehler aber es zeigt mir immer noch nichts schlaues an. und es kann noch nicht richtig auf die Infos zugreifen:
Delphi-Quellcode:
  radioInfo.dwSize:= sizeof(radioInfo);
  if (ERROR_SUCCESS = BluetoothGetRadioInfo(hRadio,radioInfo)) then
  begin
    memo1.Lines.Add('Radio: '+ radioInfo.szName)
  end
  else
  begin
    showmessage('error read RadioInfo');
  end;
ERROR_SUCCESS wird zu false ausgewertet und somit wird das error showmessage aufgerufen.
Ich weiss aber nicht wieso denn hfind ist nicht 0 es wenn ich hfind anzeigen lasse hat hfind den wert 4 (den selben wert, welcher auch sizeof(btfrp) zurück gibt) hat jemand eine idee wieso ERROR_SUCCESS zu false ausgewertet wird??

Danke für eure Hilfe
Greetz CTV
Wer glaub er ist, hört auf zu werden!
Delphi Rulez!!!
  Mit Zitat antworten Zitat
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#7

Re: Bluetooth API (JwaBluetoothAPIs) Problem erhalte immer 0

  Alt 17. Feb 2006, 11:47
so ich bin nochma einen schritt weiter:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  hRadio,hDeviceFind:THANDLE;
  hfind:HBLUETOOTH_RADIO_FIND;
  btfrp:TBlueToothFindRadioParams;
  radioInfo:BLUETOOTH_RADIO_INFO;
  deviceInfo:BLUETOOTH_DEVICE_INFO;
  deviceSearchParams:BLUETOOTH_DEVICE_SEARCH_PARAMS;

  Err:integer;

begin

try try
  btfrp.dwSize:=sizeof(btfrp);

  hFind := BluetoothFindFirstRadio( @btfrp, hRadio );
  if (hFind > 0) then begin
    repeat
      radioInfo.dwSize:= sizeof(radioInfo);
      if (ERROR_SUCCESS = BluetoothGetRadioInfo(hRadio, radioInfo)) then
        showmessage('Radio: '+ radioInfo.szName)
      else
        showmessage('error');

      deviceInfo.dwSize := sizeof(deviceInfo);
      deviceSearchParams.dwSize := sizeof(deviceSearchParams);
      deviceSearchParams.fReturnRemembered := true;
      deviceSearchParams.hRadio := hRadio;

      hDeviceFind := BluetoothFindFirstDevice(deviceSearchParams, deviceInfo);

      if (hDeviceFind>0) then begin
        while(BluetoothFindNextDevice(hDeviceFind, deviceInfo)) do begin
          showmessage('Device: '+deviceInfo.szName);
        end;
        BluetoothFindDeviceClose(hDeviceFind);
      end;

        BluetoothGetDeviceInfo(hRadio, deviceInfo);
        showmessage('Device: '+deviceInfo.szName);
      end;
    until (BluetoothFindNextRadio( hFind, hRadio ) );
    BluetoothFindRadioClose( hFind );
  end else begin
    Err:=GetLastError;
    showmessage(SysErrorMessage(Err)+' ('+inttostr(Err)+')');
  end;

except
  on E:Exception do begin
    showmessage('error'+e.Message);readln;
  end;
end;
finally
//readln;
end;
end;
das Problem ist nun folgendes:
showmessage(SysErrorMessage(Err)+' ('+inttostr(Err)+')');
gibt mir aus:
"Es sind keine Daten mehr verfügbar (259)" und ich weiss nicht genau was damit gemient ist und was dass genau das Probelm ist

wenn jemand eine vermutung oder eine ahnung hat bitte melden
danke

Greetz Cy
Wer glaub er ist, hört auf zu werden!
Delphi Rulez!!!
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:42 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