Autor Beitrag
Yumy
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 17.04.09 14:26 
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:
ausblenden 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 user profile iconChristian S.: Topic aus Sonstiges (.NET) verschoben am Fr 17.04.2009 um 14:36
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Yumy Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
www.dvbdream.de/forum_thread_1752.html
(ist zwar Delphi-Code aber die Parameter sollten sich dann entsprechend auch nach C# übersetzen lassen)
Yumy Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 18.04.09 14:22 
Habe es jetzt soweit:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 18.04.09 15:53 
user profile iconYumy hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 18.04.09 17:39 
ah ok - vielen dank ;)

bin jetzt so weit :
ausblenden C#-Quelltext
1:
protected static extern bool IR_Open(System.IntPtr hWnd, int someConst,int verboseLevel,short devicePort);					


und :
ausblenden C#-Quelltext
1:
IR_Open(this.Handle, 001)					


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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