Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi WiimoteLib.dll in Delphi (https://www.delphipraxis.net/125390-wiimotelib-dll-delphi.html)

napsterxx 5. Dez 2008 07:54


WiimoteLib.dll in Delphi
 
Hi,
also ich bin auf diese DLL gestoßen und würde sie gerne in Delphi benutzten, da ich kein C und auch kein VB gefunden habe, um mit meiner WiiMote meinen PC einwenig ansteuern zu können.

Interessante Links:
http://www.kudzuworld.com/blogs/Tech/20070817A.de.aspx
http://www.wiili.org/index.php/Wiimote
http://blogs.msdn.com/coding4fun/arc...4/1879033.aspx

Phoenix 5. Dez 2008 11:25

Re: WiimoteLib.dll in Delphi
 
Die WiimoteLib.dll ist ein .NET Assembly. Mit normalen Delphi Win/32 wirst Du da etwas Schwierigkeiten haben.

Das heisst, Du wirst entweder Reverse P/Invoke nutzen müssen, oder aber die Klassen in dem Assembly in einer .NET Sprache Com-Visible machen müssen, damit dann via COM aus Delphi heraus darauf zugreifen kannst. Allerdings ist der COM-Zugriff relativ langsam, was bei einem Eingabegerät zu deutlichen Verzögerungen führen dürfte. Das macht wahrscheinlich nicht wirklich Spass.

Alternativ kannst Du Dir mal die Trial von Delphi Prism holen und damit herumspielen. Das sollte relativ einfach sein. Einfach das Assembly referenzieren und los gehts ;-)

napsterxx 5. Dez 2008 16:40

Re: WiimoteLib.dll in Delphi
 
So habe es mir mal gedownloaded und installiert.
Frage 1:
Wie lange hält diese Testversion, und gibt es eine Personal darvon?

Frage 2:
Ich habe ein neues Projekt erstellt "WindowsAPplication". Was nun? Der Quellcode sieht nicht sehr Delphi-typisch aus. Wie "importe" ich nun die DLL?

napsterxx 5. Dez 2008 19:44

Re: WiimoteLib.dll in Delphi
 
http://www.nopaste.com/p/avzOdBXb0

Habe mich mal daran probiert, aber er kennt Wiimote nicht :(

napsterxx 6. Dez 2008 15:34

Re: WiimoteLib.dll in Delphi
 
:cheer:
Kommt schon und helft mir :D

Phoenix 7. Dez 2008 12:18

Re: WiimoteLib.dll in Delphi
 
Du hast in Deinem Projekt einen Ordner, der heisst 'References' (bzw. Referenzen? Ich hab kein deutsches Visual Studio hier).

Dort gehst Du auf Referenz hinzufügen und wählst dann die WiimodeLib.dll aus. Damit wird eine Referenz auf das Assembly zu Deinem Projekt hinzugefügt. Ab diesem Zeitpunkt hast Du die Möglichkeit, den Namespace der WiimoteLib in die Uses-Klausel Deiner Unit hinzuzufügen. (Jaaa, ich weiss.. in .NET gibt es keine 'Unit' mehr, das ist tatsächlich 'nur' eine Datei, aber um im Delphi-Slang zu bleiben passt das jetzt mal).

Also entsprechend:
Delphi-Quellcode:
uses WiimoteLib;
Und dann solltest Du mittels
Delphi-Quellcode:
var wm := new Wiimote();
Die Instanz bekommen auf der Du dann gemäß den Beispielen aus dem Blog-Artikel hier weiter machen kannst.

Phoenix 7. Dez 2008 12:19

Re: WiimoteLib.dll in Delphi
 
Zitat:

Zitat von napsterxx
Wie lange hält diese Testversion, und gibt es eine Personal darvon?

30 Tage lang und nein, es gibt Stand jetzt keine Personal Version. Es soll wohl aber demnächst ein kostenloser Kommandozeilen-Compiler herauskommen.

napsterxx 7. Dez 2008 18:12

Re: WiimoteLib.dll in Delphi
 
Also ich bin nun soweit:
http://rafb.net/p/toPiPX65.html

Ich bekomme jedoch immer in Zeile 65 folgende Fehlermeldung:
Zitat:

Auf zugrunde liegendes Ereignisfeld kann nicht zugegriffen werden

grizzly 7. Dez 2008 18:35

Re: WiimoteLib.dll in Delphi
 
Ich weiß jetzt nicht, ob die obigen Links irgendwie auch auf dies hier verweisen:WiinRemote

Hab ich Mitte letzten Jahres mal ausprobiert (Meine Kids hat's gefreut, das war die Ausrede die Papa gebraucht hat um eine Wii zu kaufen)
Hat auf meiner Kiste sofort funktionert. Braucht keine Dll und kein .net. Hab's aber dann doch nicht weiterverfolgt...

Gruß
Michael

napsterxx 7. Dez 2008 19:17

Re: WiimoteLib.dll in Delphi
 
Nene, ich möchte selbst ein Programm schreiben welches auf Tastendrücke reagiert, kein fertiges.

grizzly 8. Dez 2008 08:49

Re: WiimoteLib.dll in Delphi
 
Für das erwähnte WiinRemote gibt es zumindest den Delphi-Source-code. Falls es mal Probleme beim Ansprechen der Wii Controller über die eingangs erwähnte Dll gibt, ist das vielleicht zumindest für ein paar Analysen oder gar Inspirationen gut. ;)

Gruß und viel Glück
Michael

chaosben 8. Dez 2008 10:33

Re: WiimoteLib.dll in Delphi
 
Mit dieser ( http://svn.theunknownones.net/tuo/Components/Wiimote/ als auch http://zip.theunknownones.net/tuo/Components/Wiimote/) Komponente von uns, wird die Wiimote native (ohne zusätzliche dll) eingebunden.
Entwickelt und getestet auf einem BlueSoleil-Stack.

himitsu 28. Sep 2010 11:26

AW: Re: WiimoteLib.dll in Delphi
 
Zitat:

Zitat von chaosben (Beitrag 854838)
Mit dieser ( http://svn.theunknownones.net/tuo/Components/Wiimote/ als auch http://zip.theunknownones.net/tuo/Components/Wiimote/) Komponente von uns, wird die Wiimote native (ohne zusätzliche dll) eingebunden.

Gibt's die noch irgendwo?

Zitat:

Zitat von chaosben (Beitrag 854838)
Entwickelt und getestet auf einem BlueSoleil-Stack.

Toll, dieses BlueSoleil 8.0 hat mir gestern das ganze System zerschossen
(nach 'ner halben Stunde hatte ich den Bluescreen weg, konnte es wieder starten, allerdings startet nun kein Service mehr, Computerverwaltung>Dienste ist leer, die Startleiste fehlt, die Systemwiederherstellung bringt nix und das System ist unbenutzbar)

Über die Bluetooth-Erkennung von Windows konnte zwar eine Verbindung zu den Conrolern erstellt werden, aber keines der Demoprogramme (meißt .net) oder der Delphi-Codes hat den Controler erkannt.
Das wiimote2midi fand zwar den Controler, aver das war's dann auch schon.

Dezipaitor 28. Sep 2010 11:51

AW: WiimoteLib.dll in Delphi
 
Das wäre dann wohl


himitsu 28. Sep 2010 12:31

AW: WiimoteLib.dll in Delphi
 
als ich heute Nacht http://code.google.com/p/theunknownones/ durchsucht hab, war das noch nicht da :oops:

jetzt muß nur noch das mit dem Treiber klappen :cry:
aber hier auf dem PC probier ich's nicht aus muß ja nicht sein, daß och noch 'nen fremder PC geschrottet wird.

Dezipaitor 28. Sep 2010 13:11

AW: WiimoteLib.dll in Delphi
 
Nach dem SVNLog wurde es am 8.10.2009 hinzugefügt.

Schau dir auch mal das an

http://corpsman.de/index.php?doc=pro...wii_whiteboard
http://corpsman.de/index.php?doc=projekte/wii_headtrack

himitsu 28. Sep 2010 13:20

AW: WiimoteLib.dll in Delphi
 
DasEin WhiteBoard hab ich als C-Programm da ... es startet mit einer Exception, irgendwas ala "kein Controler gefunden" und macht dann nix.

Ich werd dann nach der neuinstallation nochmal probiern, was BlueSoleil macht.
Ansonsten ist die Veriante über die Bluetooth-Kontrole von XP/7 nicht erfolgreich gewesen.
- Win7 wollte ihn nicht verbinden, da dieses "unbedingt" einen Verbindungscode nutzen will/muß
- XP verbindet, aber nach 'ner Weile ist der Controler wieder verschwunden. (scheint sich das nicht zu merken)

chaosben 28. Sep 2010 13:51

AW: WiimoteLib.dll in Delphi
 
Zitat:

Zitat von himitsu (Beitrag 1052598)
- Win7 wollte ihn nicht verbinden, da dieses "unbedingt" einen Verbindungscode nutzen will/muß
- XP verbindet, aber nach 'ner Weile ist der Controler wieder verschwunden. (scheint sich das nicht zu merken)

Deswegen gehts mit BlueSoleil am Besten (läuft bei mir @Home auch unter 7/64 ohne zu mucken, obwohl ich da die Wiimote nicht nicht probiert habe :))

himitsu 28. Sep 2010 14:11

AW: WiimoteLib.dll in Delphi
 
Leider konnte ich mein Hauptsystem (XP) nach dessen Installation entsorgen ... komplett geschrottet.
Hab heute früh mit der neuinstallation begonnen ... mal sehn was BlueSoleil zum Win7 sagt.
(hatte zum Glück schon angefangen für die Umstellung vorzusorgen, so daß es kein all zu großer Verlust ist ... nur wollte ich etwas später in Ruhe umstellen, wenn ich mehr Zeit hab, mich an alles zu gewöhnen)

chaosben 28. Sep 2010 22:12

AW: WiimoteLib.dll in Delphi
 
Es gibt eine gute und eine schlechte Nachricht:
Die Gute: ab Windows 7 braucht man keine BlueSoleil mehr, um die Wiimote mit Windows zu pairen.
Die Schlechte: unsere Wiimote-Unit arbeitet mir Read/WriteFile was mit dem MS-BT-Stack scheinbar nicht funktioniert. Alternativ müsste man die HID-Routinen nehmen. :-(

//edit: Habe gerade noch mal die Gegenprobe gemacht: ja, die schlechte Nachricht ist richtig

himitsu 1. Okt 2010 20:00

AW: WiimoteLib.dll in Delphi
 
In Win7 konnte ich die Wiimote auch leicht verbinden (ohne BlueSoleil), aber keines der Anwendungen (gegal ob .net, c++ oder Delphi und egal ob via HID oder über sonstwie) hat diese Controler nutzen können.

Fast alle Anwendungen erkannten zwar den Controler, aber sie reragierten auf keinerlei Befehle.

Bisher hat also nur BlueSoleil funktioniert.
Wobei mir dieses auch in Win7 einmal einen Bluescreen verursachte.

Ich hab auch gesehn, daß jemand über die neue Windows 7 Windows Sensor and Location Platform einen unabhängigen Treiber erstellt hatte, allerdings hat dieser nur die G-Sensoren darüber angeschlossen, so daß es noch keine Lösung ist.
(hatte leider den Link nicht gespeichert und dann kam der blaue Bildshirm)

chaosben 2. Okt 2010 08:06

AW: WiimoteLib.dll in Delphi
 
Inzwischen bin ich so weit, das ich mit dem MS-Stack der Wiimote etwas senden kann. Nur leider klappt das Empfangen noch nicht.

himitsu 2. Okt 2010 08:22

AW: WiimoteLib.dll in Delphi
 
Was ich auch schade finde.
Überall wird vorwigend auf WiiLi.org verwiesen, welches allerdings down ist.

[edit] OK, dann isses wohl nicht so schlimm http://wiibrew.org/wiki/WiiLi/de
aber dennoch blöde, daß man, wenn man was via Google und Co. findet, daß man dann Links und vorallem Downlodlinks vorfindet, welche nicht mehr funktionieren.


hier noch der Link zum Treiber ... vielleicht kann damit wer was anfangen
http://www.codeproject.com/KB/system/wiisensor.aspx

PS: WiiLi = Wii+Linux ... aber wer braucht schon Linux, wenn man Windows hat :mrgreen:

himitsu 11. Okt 2010 13:19

AW: WiimoteLib.dll in Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich muß (möchte) noch die WiiControl.pas aufräumen, bevor ich diese mal zeige.
Darin 'ne eigene kleine Klasse, welche die HID-Geräte verwaltet, ähnlich dem TJvHidDeviceController. (nur daß ich ohne die JEDI arbeite :oops: )
Etwas, welches die Grundklasse der HID-Geräte darstellt und die ersten Teile des Wii-Controlers und einiger Extender (Nunchuk und Co.),


Im Anhang 'ne Test-Anwendung mit nachfolgendem Code.
Diese macht das, was sich schon ansteuern läßt ... LEDs und der Vibrator. :stupid:

Funktioniert unter WinXP + BlueSoleil, sowie nativ unter Win7 x86 (ohne BlueSoleil).

Vielleicht kann's ja schonmal wer ausprobieren, also ob der Teil auch wirklich schon richtig funktioniert.
> die LEDs sollten blinken und der Vibrator sollte an und aus gehn.
Delphi-Quellcode:
Program WiiControlP;

Uses Windows, SysUtils, Forms, Generics.Collections, WiiControl;

Procedure OnRecive(Sender: THIDDevice; Const Data; Len: Integer);
  Var S: String;
    i:  Integer;

  Begin
    WriteLn('OnRecive');
    WriteLn(' Instance ', Sender.DeviceInfo.Instance);
    S := ' Data';
    For i := 0 to Len - 1 do Begin
      If i mod 20 = 0 Then Begin
        WriteLn(S);
        S := '  ';
      End Else If i mod 5 = 0 Then
        S := S + ' ';
      S := Format('%s %.2x', [S, PByte(@Data)[i]]);
    End;
    WriteLn(S);
    WriteLn;
  End;

Procedure OnError(Sender: TWiiRemoteController; ReportID, ErrorCode: Byte);
  Begin
    WriteLn('OnReceptError');
    WriteLn(' Instance ', Sender.DeviceInfo.Instance);
    WriteLn(' ReportID ', Format('$%.2x', [ReportID]));
    WriteLn(' ErrorCode ', ErrorCode);
    WriteLn;
  End;

Procedure DeviceChange(Controler: THIDControler);
  Begin
    WriteLn('DeviceChange');
    WriteLn;
  End;

Procedure DeviceArrival(Controler: THIDControler; Const DeviceInfo: THIDDeviceInfo);
  Var Device: THIDDevice;

  Begin
    WriteLn('DeviceArrival');
    WriteLn(' ClassGUID           ', GUIDToString(DeviceInfo.ClassGUID));
    WriteLn(' Instance            ', DeviceInfo.Instance);
    WriteLn(' Path                ', DeviceInfo.Path);
    WriteLn(' Description         ', DeviceInfo.Description);
    WriteLn(' PhysicalDeviceObject ', DeviceInfo.PhysicalDeviceObject);
    If Controler.CompareByID(DeviceInfo, WIIMOTE_VENDOR_ID, WIIMOTE_PRODUCT_ID) Then Begin
      Device := Controler.Arrival(DeviceInfo, TWiiRemoteController);
      Device.OnRecive := OnRecive;
      TWiiRemoteController(Device).OnReceptError := OnError;

      WriteLn(' Arrivaled');
      WriteLn('   VendorID          ', Format('$%.4x', [Device.VendorID]));
      WriteLn('   ProductID         ', Format('$%.4x', [Device.ProductID]));
      WriteLn('   ProductStr        ', Device.ProductStr);
      WriteLn('   Version           ', Device.Version);
      WriteLn('   Manufacturer      ', Device.Manufacturer);
      WriteLn('   SerialNumber      ', Device.SerialNumber);
      WriteLn('   Identifier        ', Device.Identifier);
    End;
    WriteLn;
  End;

Procedure DeviceRemoval(Controler: THIDControler; Const DeviceInfo: THIDDeviceInfo; DeviceObject: THIDDevice);
  Begin
    WriteLn('DeviceRemoval');
    WriteLn(' ClassGUID           ', GUIDToString(DeviceInfo.ClassGUID));
    WriteLn(' Instance            ', DeviceInfo.Instance);
    WriteLn(' Path                ', DeviceInfo.Path);
    WriteLn(' Description         ', DeviceInfo.Description);
    WriteLn(' PhysicalDeviceObject ', DeviceInfo.PhysicalDeviceObject);
    If Assigned(DeviceObject) Then Begin
      WriteLn(' Arrivaled');
      WriteLn('   SerialNumber      ', DeviceObject.SerialNumber);
      WriteLn('   Identifier        ', DeviceObject.Identifier);
      DeviceObject.Free;
    End;
    WriteLn;
  End;

Var HIDControler: THIDControler;
  Report: TWiiReport;

Begin
  Try
    AllocConsole;
    Application.Initialize;
    HIDControler := GlobalHIDControler;
    HIDControler.RegisterDeviceChangeProc(DeviceChange);
    HIDControler.RegisterDeviceArrivalProc(DeviceArrival);
    HIDControler.RegisterDeviceRemovalProc(DeviceRemoval);
    Repeat
      Application.ProcessMessages;
      Sleep(10);
      TWiiRemoteController(HIDControler.ArrivaledDevice[0]).LEDs := [blRumble, blLED2];
      Sleep(200);
      TWiiRemoteController(HIDControler.ArrivaledDevice[0]).LEDs := [blLED1, blLED4];
      Sleep(1000);
      Report.Clear;
      Report.ReportID       := WII_RID_MODE;
      Report.Continuous     := True;
      Report.RequestReportID := WII_RECEPT_STATUS;
      HIDControler.ArrivaledDevice[0].Send(Report, WIIMOTE_BT_REPORT_LEN);
    Until Application.Terminated;
    While HIDControler.ArrivaledDeviceCount > 0 do
      HIDControler.ArrivaledDevice[0].Free;
    HIDControler.UnregisterDeviceChangeProc(DeviceChange);
    HIDControler.UnregisterDeviceArrivalProc(DeviceArrival);
    HIDControler.UnregisterDeviceRemovalProc(DeviceRemoval);
  Except
    On E: Exception do WriteLn(E.ClassName, ': ', E.Message);
  End;
End.
[add]
hab das Ganze mal als eigenständiges Projekt reingestellt
http://www.delphipraxis.net/155160-wiimote-pc.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 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-2025 by Thomas Breitkreuz