![]() |
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: ![]() ![]() ![]() |
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 ;-) |
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? |
Re: WiimoteLib.dll in Delphi
|
Re: WiimoteLib.dll in Delphi
:cheer:
Kommt schon und helft mir :D |
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:
Und dann solltest Du mittels
uses WiimoteLib;
Delphi-Quellcode:
Die Instanz bekommen auf der Du dann gemäß den Beispielen aus dem
var wm := new Wiimote();
![]() |
Re: WiimoteLib.dll in Delphi
Zitat:
|
Re: WiimoteLib.dll in Delphi
Also ich bin nun soweit:
![]() Ich bekomme jedoch immer in Zeile 65 folgende Fehlermeldung: Zitat:
|
Re: WiimoteLib.dll in Delphi
Ich weiß jetzt nicht, ob die obigen Links irgendwie auch auf dies hier verweisen:
![]() 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 |
Re: WiimoteLib.dll in Delphi
Nene, ich möchte selbst ein Programm schreiben welches auf Tastendrücke reagiert, kein fertiges.
|
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 |
Re: WiimoteLib.dll in Delphi
Mit dieser (
![]() ![]() Entwickelt und getestet auf einem BlueSoleil-Stack. |
AW: Re: WiimoteLib.dll in Delphi
Zitat:
Zitat:
(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. |
AW: WiimoteLib.dll in Delphi
|
AW: WiimoteLib.dll in Delphi
als ich heute Nacht
![]() 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. |
AW: WiimoteLib.dll in Delphi
Nach dem SVNLog wurde es am 8.10.2009 hinzugefügt.
Schau dir auch mal das an ![]() ![]() |
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) |
AW: WiimoteLib.dll in Delphi
Zitat:
|
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) |
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 |
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 ![]() (hatte leider den Link nicht gespeichert und dann kam der blaue Bildshirm) |
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.
|
AW: WiimoteLib.dll in Delphi
Was ich auch schade finde.
Überall wird vorwigend auf ![]() [edit] OK, dann isses wohl nicht so schlimm ![]() 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 ![]() PS: WiiLi = Wii+Linux ... aber wer braucht schon Linux, wenn man Windows hat :mrgreen: |
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:
[add]
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. hab das Ganze mal als eigenständiges Projekt reingestellt ![]() |
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