Avatar billede koppelgaard Praktikant
25. juli 2007 - 13:00 Der 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.

ActiveX ligger på siden:
http://www.bmcm.de/software/products/usb/pio/index-us.html

Jeg giver 100 for oversættelse og 200, hvis det kommer til at virke.
Michael


#import "c:\program files\bmc messsysteme\activex\memx.ocx"
/* as defined during installation */
...
MEMXLib::_DmeMPIOPtr pio;
...
pio.CreateInstance (__uuidof(MEMXLib::meMPIO));
if (pio == NULL)
/* error handling */
...
if (pio->InstalledCards == 0)
printf ("meM-PIO not connected!\n");
Avatar billede sgaardbo Nybegynder
25. juli 2007 - 13:14 #1
Hej Michael,

Jeg tror da, at du næsten var der i går.

Du fik lavet en instans med new meMPIO. Har du prøvet:

MEMXLib.meMPIO  p = new MEMXLib.meMPIO();
if (p.InstalledCards == 0)
  Console.Out.WriteLine("meM-PIO not connected");

  Søren.
Avatar billede koppelgaard Praktikant
25. juli 2007 - 14:12 #2
Nix, det er det der ikke virker.

Og BMCM som jeg har købt udstyret af kan ikke hjælpe. De har ikke en programstump og kender ikke C#.
For dårligt vil jeg sige.

Kender du C++? Så vidt jeg kan se står der ikke helt det samme...

Michael
Avatar billede sgaardbo Nybegynder
25. juli 2007 - 14:18 #3
Får du en fejlmeddelelse på runtime, eller en fejlmeddelelse fra compileren?

Prøv at poste den kode du har skrevet.

  Søren.
Avatar billede koppelgaard Praktikant
25. juli 2007 - 14:35 #4
Jeg får ingen fejl. Blot er bool b og b1 false.
Du kan se jeg har førsøgt på to måder, ingen af dem kan se instumentet.


private void button1_Click(object sender, EventArgs e)
        { 
            MEMXLib.meMPIO p = new MEMXLib.meMPIO();
            MEMXLib.meMPIOClass p1 = new MEMXLib.meMPIOClass();
           
            bool b1;
            b1=p1.Attached;
            textBox1.Text = Convert.ToString(b1);

            bool b2;           
            b2 = p.Attached;
            textBox2.Text = Convert.ToString(b2);           
           
        }
Avatar billede sgaardbo Nybegynder
25. juli 2007 - 14:45 #5
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?

  Søren.
Avatar billede koppelgaard Praktikant
25. juli 2007 - 15:20 #6
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#.

Michael
Avatar billede sgaardbo Nybegynder
25. juli 2007 - 15:31 #7
Jamen kaffe skal der sgu'da til!

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.

  Søren.
Avatar billede koppelgaard Praktikant
25. juli 2007 - 16:02 #8
Du mener jeg skal se på objektet i VB?
Avatar billede sgaardbo Nybegynder
25. juli 2007 - 16:11 #9
Jep, sorry hvis det var lidt uklart.

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.

  Søren.
Avatar billede koppelgaard Praktikant
25. juli 2007 - 16:12 #10
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

Private Sub CmdTst_Click(Index As Integer)

    Dim str As String
    str = _
    "Port 1: " & _
    mem.GetLine(1, 1) & _
    mem.GetLine(1, 2) & _
    mem.GetLine(1, 3) & _
    mem.GetLine(1, 4) & _
    mem.GetLine(1, 5) & _
    mem.GetLine(1, 6) & _
    mem.GetLine(1, 7) & _
    mem.GetLine(1, 8) & vbLf
   
    str = str + _
    "Port 2: " & _
    mem.GetLine(2, 1) & _
    mem.GetLine(2, 2) & _
    mem.GetLine(2, 3) & _
    mem.GetLine(2, 4) & _
    mem.GetLine(2, 5) & _
    mem.GetLine(2, 6) & _
    mem.GetLine(2, 7) & _
    mem.GetLine(2, 8) & vbLf
   
    str = str + _
    "Port 3: " & _
    mem.GetLine(3, 1) & _
    mem.GetLine(3, 2) & _
    mem.GetLine(3, 3) & _
    mem.GetLine(3, 4) & _
    mem.GetLine(3, 5) & _
    mem.GetLine(3, 6) & _
    mem.GetLine(3, 7) & _
    mem.GetLine(3, 8) & vbLf

MsgBox str
   
End Sub

Public Sub setupPio()
    On Error GoTo errHandler
   
    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
Avatar billede koppelgaard Praktikant
25. juli 2007 - 16:12 #11
Og nu tager jeg hjem
Avatar billede sgaardbo Nybegynder
25. juli 2007 - 16:37 #12
Hmm, jeg kan ikke finde et sted hvor FormPio.meMPIO1 bliver oprettet, men det sker måske i en anden fil (formen?).

Hvornår kalder du setupPIO?
 

  Søren.
Avatar billede koppelgaard Praktikant
26. juli 2007 - 08:22 #13
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.

Michael
Avatar billede sgaardbo Nybegynder
26. juli 2007 - 09:10 #14
Ok.

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,
}

Console.Out.WriteLine("Antal installerede kort: " + mPio.InstalledCards);

Prøv at se om det kan give dig noget...

  Søren.
Avatar billede koppelgaard Praktikant
26. juli 2007 - 10:09 #15
Kompileret  blev det :

    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.


Michael
Avatar billede sgaardbo Nybegynder
26. juli 2007 - 10:19 #16
Mystisk.

Jeg kom lige til at se, at de tæller fra 1..LastAttatched, men det er ikke sikkert at det betyder noget. Man bør nok tælle:

for(int i = 1; i <= mPio.LastAttached; i++)

Ellers misser man den sidste i listen.

Har du nogen idé om hvad mPio.LastAttached returnerer? -Er den 0 (nul)

  Søren.
Avatar billede koppelgaard Praktikant
26. juli 2007 - 11:04 #17
Den returnerer en int.
Jeg lavede følgende kode i går.
Resultatet er hhv. false og 0 uanset hvad jeg sætter cardid til

private void button1_Click(object sender, EventArgs e)
        {

           
            MEMXLib.meMPIO p = new MEMXLib.meMPIOClass();

            p.CardId = 4;

            bool b2;
            b2 = p.Attached;
            MessageBox.Show( Convert.ToString(b2));

           
           
            int s=p.LastAttached;
            MessageBox.Show(Convert.ToString(s));
        }
Avatar billede sgaardbo Nybegynder
26. juli 2007 - 11:25 #18
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.

  Søren.
Avatar billede koppelgaard Praktikant
26. juli 2007 - 13:45 #19
Har ringet til tyskland og gået dem rigtig meget på klingen.
Så må vi se  om det ikke ryster op med et svar.
Avatar billede koppelgaard Praktikant
05. august 2007 - 22:04 #20
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#).
Avatar billede koppelgaard Praktikant
17. august 2007 - 07:43 #21
Jeg tror jeg lukker.
Hvad vil du have for din indsats ?
Avatar billede koppelgaard Praktikant
04. september 2007 - 15:12 #22
lukker.
Hvis du vil have point, må du skrive må m.koppelgaard@gmail.com
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester