Entwickler-Ecke
Basistechnologien - Unbekannte DLL nutzen
Yumy - Fr 17.04.09 14:26
Titel: Unbekannte DLL nutzen
Hi ich will zum ersten mal mit dll´s arbeiten und habe ein kleines Problem.
Ich habe eine dll von der ich nur die Funktionsnamen kenne (irremote.dll).
nun habe ich das hier mal versucht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| [DllImport("IRREMOTE.dll")] protected static extern void IR_Open(); protected static extern int IR_GetKeyCode();
private void Form1_Load(object sender, EventArgs e) { IR_Open();
} |
bekomme aber diese Fehlermeldung:
System.TypeLoadException wurde nicht behandelt.
Message="Der Typ \"WindowsFormsApplication1.Form1\" der Assembly \"dll bsp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\" konnte nicht geladen werden, da die Methode \"IR_GetKeyCode\" keine Implementierung (keine RVA) hat."
Source="dll bsp"
TypeName="WindowsFormsApplication1.Form1"
StackTrace:
bei WindowsFormsApplication1.Program.Main()
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:
Was mache ich falsch?
Bin über grundlegende Tips zu dll´s auch dankbar :)
Moderiert von
Christian S.: Topic aus Sonstiges (.NET) verschoben am Fr 17.04.2009 um 14:36
Christian S. - Fr 17.04.09 14:36
Hallo!
Du musst das DllImport-Attribut jeder Method anheften, die aus einer Unmanaged-DLL-Datei kommen soll. Das Attribut heißt "Nimm diese Methode aus der DLL" und nicht "Importiere alle Methoden aus der DLL".
Grüße
Christian
Yumy - Fr 17.04.09 15:00
Vielen dank für die schnelle Antwort.
Habe gemacht was du gesagt hast - und siehe da - die Fehlermeldung ist weg.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| [DllImport("IRREMOTE.dll")] protected static extern void IR_Open(); [DllImport("IRREMOTE.dll")] protected static extern int IR_GetKeyCode(); [DllImport("IRREMOTE.dll")] protected static extern int IR_GetVersion(); [DllImport("IRREMOTE.dll")] protected static extern void IR_Power(); [DllImport("IRREMOTE.dll")] protected static extern int IR_GetSystemKeyCode(); [DllImport("IRREMOTE.dll")] protected static extern int IR_GetKeyCodeEx();
private void Form1_Load(object sender, EventArgs e) { IR_Open(); IR_Power(); }
private void timer1_Tick(object sender, EventArgs e) { label1.Text = Convert.ToString(IR_GetKeyCodeEx()); } |
Versuche den KeyCode zu ermitteln der erzeugt wird wenn ich auf meiner Fernbedienung etwas drücke.
Allerdings passiert rein gar nichts. Auch die Version wird mir nur mit "0" ausgegeben.
Irgendwelche ideen was ich da machen könnte? Bzw ist der Ansatz solche Daten über einen Timer abzufragen überhaupt sinnvoll ?
Es gibt leider keine Dokumentation oder ähnliches über diese dll.
Th69 - Fr 17.04.09 19:15
Du hast zwar jetzt die Funktionsnamen der DLL herausgefunden, aber es fehlen noch Rückgabewert und Parameter.
Mittels einer Suchmaschine habe ich z.B. diese Seite gefunden:
http://www.dvbdream.de/forum_thread_1752.html
(ist zwar Delphi-Code aber die Parameter sollten sich dann entsprechend auch nach C# übersetzen lassen)
Yumy - Sa 18.04.09 14:22
Habe es jetzt soweit:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| [DllImport("IRREMOTE.dll")] protected static extern bool IR_Open(HWND hWnd,int someConst,int verboseLevel,short devicePort); [DllImport("IRREMOTE.dll")] protected static extern short IR_GetKeyCode(char repeatCount); [DllImport("IRREMOTE.dll")] protected static extern int IR_GetVersion(); [DllImport("IRREMOTE.dll")] protected static extern bool IR_Power(short onOff); [DllImport("IRREMOTE.dll")] protected static extern int IR_GetSystemKeyCode(char repeatCount, char remoteUsed, char remoteKey); [DllImport("IRREMOTE.dll")] protected static extern short IR_GetKeyCodeEx(char repeatCount);
private void Form1_Load(object sender, EventArgs e) { timer1.Start(); }
private void timer1_Tick(object sender, EventArgs e) { label1.Text = Convert.ToString(IR_GetVersion()); } |
Allerdings weiß ich nicht wie ich nun IR_Open aufrufen soll.
HWND- handle gibt es so in C# nicht und ich bin mir nicht sicher wie ich hWnd deklarieren, bzw was ich damit übergeben soll.
Der Rückgabewert von IR_Open gibt dann an ob es geklappt hat oder nicht aber soweit komme ich ja leider nicht.
Leider sind alle Tutorials auf dem gebiet recht einfach gehalten indem sie einfach nur beschreiben wie man eine Funktion aufruft die zB. Hello World ausspuckt.
Freue mich über jeden Ansatz.
Kha - Sa 18.04.09 15:53
Yumy hat folgendes geschrieben : |
| HWND- handle gibt es so in C# nicht und ich bin mir nicht sicher wie ich hWnd deklarieren, bzw was ich damit übergeben soll. |
Das ist wohl das Handle deines Fensters, also
this.Handle.
Yumy - Sa 18.04.09 17:39
ah ok - vielen dank ;)
bin jetzt so weit :
C#-Quelltext
1:
| protected static extern bool IR_Open(System.IntPtr hWnd, int someConst,int verboseLevel,short devicePort); |
und :
C#-Quelltext
1:
| IR_Open(this.Handle, 0, 0, 1) |
allerdings weiß ich nicht was ich für someConst , verboseLevel und devicePort übergeben soll. Einfach eine Zahl wie 0/1 etc reicht leider nicht.
IR_Open bleibt immer false.
Irgendwer vielleicht noch eine Idee?
Kha - Sa 18.04.09 18:45
someConst und verboseLevel sind doch auf der verlinkten Seite erklärt. Für devicePort müsstest du mal das dort angehängte Projekt herunterladen.
Yumy - So 19.04.09 12:12
Habe mir die Beispiel datei einmal runtergeladen und ausprobiert.
Leider bekomme ich dort den selben fehler wie in meinem C# programm.
Möglicherweise stimmen die werte für "devicePort" nicht.
Nur woher hat der ersteller des Beispiels diese werte ?
#define IR_PORT_AUTODETECT 0x00
#define IR_PORT_OB 0x30
#define IR_PORT_BOX 0x34
#define IR_PORT_Z8 0xE2
#define IR_PORT_USB2 0x60
#define IR_PORT_MCE 0xFFBC
#define IR_PORT_HCWHID 0xFFFE
//this one seems good for WinTV Nova-S-Plus PCI
#define IR_PORT_880 0xFFFF
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!