tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 2 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
568
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    zosik zosik ist offline Grünschnabel
    Registriert seit
    Sep 2010
    Beiträge
    3
    Hallo zusammen,

    ich muss in meiner C#- Application verschiedene COM-Schnittstellen verwenden, unter anderem auch eine Methode, die als Argumenten ref byte und ref uint ewartet, also
    Code :
    1
    
    writeToStream(ref byte Stream, ref uint size)

    Dabei heißt es in der Doku, dass Stream ein byte array ist, in welches die Daten dann geschrieben werden.

    Die Frage ist also, wie bekomme ich ref byte aus einem byte[] ?

    Danke für die Hilfe!
     

  2. #2
    Avatar von StupidBoy
    StupidBoy StupidBoy ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Bremen
    Beiträge
    197
    Kannst du uns auch sagen welche COM-Schnitstellen du verwendest? Dann könnte man sich die Docs auch selbst mal anscheuen.

    Ich glaube, dass ich dich nicht ganz verstehe. Du postest eine Methoden-Signatur die als erstes Argument ein Byte by reference entgegen nimmt. Nirgends sehe ich ein Byte-Array. Und wieso willst du ein Byte aus einem Byte-Array bekommen?

    Der Aufruf müsste im wesentlichen folgendermaßen aussehen:

    Code csharp:
    1
    2
    3
    
    byte myByte = 47;
    uint myUint = 11;
    writeToStream(ref byte Stream, ref uint size)

    Nach dem Aufruf hätten myByte und myUnit einen anderen Wert.
     
    Grüße SB

  3. #3
    zosik zosik ist offline Grünschnabel
    Registriert seit
    Sep 2010
    Beiträge
    3
    Vielen Dank für die Antwort!

    byte array muss ich selber in meiner c# application erstellen, um den Speicherplatz zu reservieren. Die Methode kriegt vermutlich ein Verweis auf byte[] und wird den Speicherplatz mit den Daten füllen. Das Problem ist nur, dass die Methode ref byte erwartet und kein byte * oder byte[] !
     

  4. #4
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo zosik,

    woher stammt denn die Methoden-Signatur "writeToStream(ref byte Stream, ref uint size)"? Dass du damit den gewünschten Zweck nicht erreichen kannst ist offensichtlich. Falls das von einem DllImport ...] stammt, muss dort die Signatur korrigiert werden.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  5. #5
    zosik zosik ist offline Grünschnabel
    Registriert seit
    Sep 2010
    Beiträge
    3
    Hallo MCoder,

    Zitat Zitat von MCoder Beitrag anzeigen
    woher stammt denn die Methoden-Signatur "writeToStream(ref byte Stream, ref uint size)"?
    diese Methode stammt aus einer COM-Schnittstelle, die mir zur Verfügung gestellt wurde. Ich kann nichts an dieser Schnittstelle ändern. C++ - Methode, die hinter dieser Schnittstelle steht, hat folgende Signatur (idl) :
    Code :
    1
    2
    
     
    HRESULT WriteToStream([in] byte *Stream, [in,out] UINT* pSize);
     

  6. #6
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hmm, ausgehend von der C++ - Methode müsste die C# - Methode eigentlich eher so aussehen:
    Code csharp:
    1
    
    writeToStream(byte [] stream, ref uint size)
    Im Zusammenhang mit C# habe ich noch keine COM-DLLs verwendet und kenne mich da nicht weiter aus. Wie kommt man denn von der C++ - Signatur zur C# - Signatur ?

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von MCoder Beitrag anzeigen
    Hmm, ausgehend von der C++ - Methode müsste die C# - Methode eigentlich eher so aussehen:
    Code csharp:
    1
    
    writeToStream(byte [] stream, ref uint size)
    Im Zusammenhang mit C# habe ich noch keine COM-DLLs verwendet und kenne mich da nicht weiter aus. Wie kommt man denn von der C++ - Signatur zur C# - Signatur ?
    Der Code war nicht direkt C++ sondern IDL.

    Daraus erzeugt der MIDL Compiler eine Type Library (tlb).

    Aus der TLB erzeugt tlbimp dann eine .NET Assembly DLL.

    Das Problem ist, das der MIDL Compiler die Information, dass es sich um ein Array bei dem Parameter handelt nicht in die TLB übersetzen kann.

    Man muss tatsächlich die DLL neu erzeugen indem man den Code disassembliert, die Signatur ändert und letztlich wieder zusammenbaut.

    Siehe http://msdn.microsoft.com/en-us/libr...agemsilanchor1

    Gruß
    MCoder und zosik bedanken sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Müsste es nicht reichen per Marshal (statische Methode fehlt mir grad nicht ein, irgendwas mit Alloc ) den Speicherplatz des Array zu allozieren und ein IntPtr zu übergeben?
    Und dieses dann halt später wieder auslesen.
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Spyke Beitrag anzeigen
    Müsste es nicht reichen per Marshal (statische Methode fehlt mir grad nicht ein, irgendwas mit Alloc ) den Speicherplatz des Array zu allozieren und ein IntPtr zu übergeben?
    Und dieses dann halt später wieder auslesen.
    Dann probiere das mal. Wie überzeugst du denn den Compiler das es OK ist, wenn du statt "ref byte" ein IntPtr übergibst?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  10. #10
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Ich war noch beim DLLImport, aber wenn ich das richtig sehe redet ihr hier über die interop dll.
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 22.02.10, 12:05
  2. Byte?
    Von h4xter im Forum Borland CBuilder und VCL
    Antworten: 2
    Letzter Beitrag: 19.07.09, 13:13
  3. int in byte[]zerlegen?
    Von pantarhei im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 2
    Letzter Beitrag: 29.06.09, 07:28
  4. Byte[] zu Image
    Von Andy0709 im Forum .NET WPF & Silverlight
    Antworten: 14
    Letzter Beitrag: 05.05.08, 17:51
  5. Hex to Byte
    Von Freak2k im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 14.10.05, 08:41