25. juli 2007 - 13:00Der er
21 kommentarer og 1 løsning
C++ kode som skal oversættes til C#
Jeg har købt en stump hardware en MEM-PIO til USB, der kan kontrolleres via ActiveX.
Der findes programmeringseksempler til Visual C++, men ikke til C# Kan nogen hjælpe mig med at oversætte nedenstående linier til C# indtil linien /* error handling */.
Alt jeg skal have er en instans, således at jeg kan få adgang til properties og metoder.
1) Har du et program der faktisk kommunikerer med instrumentet, så du kan se at det er forbundet korrekt?
2) Jeg kan se at der, i det program du vil have oversat, kaldes property'en 'InstalledCards', mens du kalder 'Attached' i din egen kode. -Er det med vilje?
Jeg har lige være over at drikke kaffe derfor sent svar.
Men jeg har et program der virker i VB6. F.eks. giver følgende kode true i VB6: Dim mem As meMPIO
Dim mem As meMPIO Private Sub Command1_Click() Set mem = FormPio.meMPIO1 MsgBox mem.Attached End Sub
Mem-pio'en er tilføjet til en form fra værktøjslinien Den er blive tilgængelig i værktøjslinien, ved at klikke den af under projekt-komponenter ved "mem activeX control module"
Grunden til at jeg ønsker oversættelse af C++ koden er for at finde ud af hvordan jeg laver en instans i C#.
Jeg tror ikke at der er noget i vejen med oprettelsen af instancen af dit meMPIO-objekt. Havde der været det, havde du fået en NullPointerException i dit kald til p.Attached.
Det ser ud til i VB koden du har postet, at de har en instans af meMPIO på deres form (FormPio.meMPIO1). Den har de sikkert fået ved at trække en komponent ind på deres form.
Prøv at:
Find og marker objektet i formen (i designmode), og se hvad der er sat i property-vinduet for denne komponent.
Hvis du ikke har adgang til formdesigneren, så prøv at se efter oprettelsen af objektet meMPIO1 på formen. Se efter om der er sat nogle andre properties på dette objekt f.eks. i form.init eller lign. steder. Det kan være at de har et kalde der åbner en port for læsning eller lign. som du mangler.
Jeg tænker på den kildekode du har, som er skrevet i VB og som virker. Det kan være at der er en eller anden form for initialiserin af objektet der skal udføres, før du kan kalde f.eks. Attached, med et fornuftigt resultat. Denne initialisering ligger *måske* i form.init eller lign.
Her er alle der indstillinger der er gjort på min mem-pio i VB6. Dette er kode jeg har skrevet, og kode der virker i VB6:
Dim mem As meMPIO
Private Sub CmdExcel_Click(Index As Integer) FormExcel.Show End Sub
Private Sub CmdCloseAll_Click() mem.ResetLine 2, 1: mem.ResetLine 2, 2: mem.ResetLine 2, 3: mem.ResetLine 2, 4: mem.ResetLine 2, 5: mem.ResetLine 2, 6: mem.ResetLine 2, 7: mem.ResetLine 2, 8 End Sub
Private Sub CmdLine_onOff_1_Click(Index As Integer) Call OnOff(2, 1) End Sub Private Sub CmdLine_onOff_2_Click(Index As Integer) Call OnOff(2, 2) End Sub
Private Sub CmdLine_onOff_3_Click(Index As Integer) Call OnOff(2, 3) End Sub Private Sub CmdLine_onOff_4_Click(Index As Integer) Call OnOff(2, 4) End Sub Private Sub CmdLine_onOff_5_Click(Index As Integer) Call OnOff(2, 5) End Sub Private Sub CmdLine_onOff_6_Click(Index As Integer) Call OnOff(2, 6) End Sub Private Sub CmdLine_onOff_7_Click(Index As Integer) Call OnOff(2, 7) End Sub Private Sub CmdLine_onOff_8_Click(Index As Integer) Call OnOff(2, 8)
End Sub
Private Sub CmdOpenAll_Click(Index As Integer) mem.port(2) = 0 + 2 + 4 + 8 + 16 End Sub
Set mem = FormPio.meMPIO1 If Not mem.DirPort1 = 0 Then mem.DirPort1 = 0 If Not mem.DirPort2 = DirOut Then mem.DirPort2 = DirOut If Not mem.DirPort3H = DirOut Then mem.DirPort3H = DirOut If Not mem.DirPort3H = DirOut Then mem.DirPort3L = DirOut Exit Sub errHandler: MsgBox "Ingen kontakt til memPio", vbInformation, Title:="Fejlmeddelse" End End Sub
Private Sub Cmd_close_Click() Me.Hide Unload FormPio End Sub
Private Sub Command1_Click() Set mem = FormPio.meMPIO1 MsgBox mem.Attached End Sub
Private Sub meMPIO1_OnDeviceAttached() MsgBox " Instrument tilsluttet" End Sub
Private Sub meMPIO1_OnDeviceDetached() MsgBox " Instrument frakoblet" End Sub
Private Sub meMPIO1_OnError(ByVal errNum As Long) MsgBox "fejl" End Sub
Sub OnOff(port As Integer, line As Integer)
If mem.GetLine(port, line) = 0 Then mem.SetLine port, line ElseIf mem.GetLine(port, line) = 1 Then mem.ResetLine port, line End If End Sub
Sub OnOff_port2(line As Integer) Call OnOff(2, line) End Sub
Public Function PortOpen(line As Integer) As Boolean
PortOpen = mem.GetLine(2, line) End Function Public Function PortOpenOnOfAll() As Boolean PortOpenOnOfAll = False If mem.GetLine(2, 1) Or mem.GetLine(2, 2) Or mem.GetLine(2, 3) Or mem.GetLine(2, 4) Or mem.GetLine(2, 5) Then PortOpenOnOfAll = True End Function
meMPIO1 bliver trukket ind fra en værktøjslinie i VB. Hermed bliver den et objekt under formen, som jeg har navngivet FormPio.
setupPIO kaldet jeg fra en anden form, hvori selve programmet køre. Det sker for at sætte der forskellige porte i mempioen til enten ind eller ud. Men der er ikke nødvendigt at gøre for at få kontakt til mempioen.
Jeg kiggede i dokumentationen, og fandt en stump kode til bla. at vise antallet af installerede kort. Det er eksempel 4.5.1 i dokumentationen. Oversat til C# bliver det til noget i denne stil (der vil givetvis være compilerfejl du må rette).
MEMXLib.meMPIO mPio = new MEMXLib.meMPIO(); for(int i = 0; i < mPio.LastAttached; i++) { mPio.CardId = i; if mPio.Attached break; }
if (mPio.Attached) { mPio.DirPort1 = DirIn; // Dette er muligvis ikke nødvendigt for eksemplet mPio.Dirport2 = DirIn; mPio.DirPort3H = DirIn, mPio.DirPort3L = DirIn, }
private void button2_Click(object sender, EventArgs e) { MEMXLib.meMPIO mPio = new MEMXLib.meMPIO(); for(int i = 0; i < mPio.LastAttached; i++) { mPio.CardId = i; if( mPio.Attached) break; }
if (mPio.Attached) { mPio.DirPort1 = MEMXLib.IO.DirIn; // Dette er muligvis ikke nødvendigt for eksemplet mPio.DirPort2 = MEMXLib.IO.DirIn; mPio.DirPort3H = MEMXLib.IO.DirIn; mPio.DirPort3L = MEMXLib.IO.DirIn; }
} }
Men nix. Jeg prøvede selv noget lign i går. Der er ikke noget udstyr attached.
Du kunne prøve at debugge dig vej gennem det eksempel du har i VB, og se om der er noget der sættes/kaldes undervejs, som du ikke får kaldt i dit C# program.
Check også om der er nogle 'compile-time' properties, der bliver sat i VB projektet. Det må du kunne se, hvis du markerer den mPio der er blevet trukket ind på VB-formen, og derefter vælge properties på den. -Det kunne være at noget skal sættes her.
Ellers er jeg ved at være løbet tør for idéer. -Beklager.
Ikke noget svar endnu ! Men en af min venner mener følgende:
Men et bud har jeg da. C++ koden laver ikke en "new", som du gør i C# - selvom man også har new i C++. Istedet kaldes pio.CreateInstance(..), hvilket tyder på der er noget statisk (sikkert for at sikre kun en instans "Singleton") - og sikkert noget mere initialisering, end der bare gøres ved new af et object. Så umiddelbart, vil jeg tro man ikke kan nøjes med en new.
- hvad med "import", kan man det i C# - det lader til at være vigtigt.
En mulighed, var at tage eksempel koden og kopilere som C++ - det burde være såen lige til (især hvis du Visual Studio Professionel - ellers kan man hente C++ Express), og lige verificere at det duer ok. Hvis det duer, kan du lave en tynd wrapper klasse i C++ og bygge et DLL. Dette DLL burde du kunne tilgå fra C# (det prøvede vi også sidst, det med at række på et DLL fra C#).
lukker. Hvis du vil have point, må du skrive må m.koppelgaard@gmail.com
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.