COM-Schnittstelle, Mscomm

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    COM-Schnittstelle, Mscomm

    Hallo Community,

    ich hab ein kleines Problem. Und zwar möchte ich per Mscomm daten über meine Schnittstelle verschicken. Soweit so gut klappt auch alles. Lediglich bei

    VB.NET-Quellcode

    1. MsComm1.Output = Chr(&HC0)
    erhalte ich einen Error bzw. ein HResult 0x800A017C. Habe schon gegoogelt und einiges ausprobiert.

    Weis einer noch etwas das ich testen könnte?

    Hier die genaue Fehlerangabe:

    System.Runtime.InteropServices.COMException wurde nicht behandelt.
    ErrorCode=-2146827908
    Message=Ausnahme von HRESULT: 0x800A017C (CTL_E_INVALIDPROPERTYVALUE)
    Source=Interop.MSCommLib
    StackTrace:
    bei MSCommLib.IMSComm.set_Output(Object pvarOutput)
    bei AxMSCommLib.AxMSComm.set_Output(Object value)
    bei Projekt1.SerIO.SetCS_OutBufComm() in C:\Users\**\Desktop\neu\SerIO.vb:Zeile 82.
    bei Projekt1.Form1.SendFaData() in C:\Users\**\Desktop\neu\FaSimul.vb:Zeile 205.
    bei Projekt1.Form1.Timer1_Tick(Object eventSender, EventArgs eventArgs) in C:\Users\**\Desktop\neu\FaSimul.vb:Zeile 177.
    bei System.Windows.Forms.Timer.OnTick(EventArgs e)
    bei System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.Run(Form mainForm)
    bei Projekt1.Form1.Main() in C:\Users\**\Desktop\neu\FaSimul.Designer.vb:Zeile 0.
    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:



    Vielen Danke!
    Willkommen im Forum. :thumbup:
    Was ist denn MsComm1 für ein Objekt?
    Wie ist wes initialisiert?
    Wie lautet der andere relevante Code?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Property Output erwartet einen COM-VARIANT als Typ, den es in .NET aber nicht gibt. Also muss der passende Typ aus dem vorliegenden Typ (bei dir Char) erzeugt werden. Hier wäre der Code hilfreich, den der TypLib-Importer von der Property erzeugt hat, insbesondere die Attribute. Dort steht, wie der Marshaller CLR-Typen in native Typen konvertiert. Wenn das bekannt ist, kannst du auf den Interopseiten nachschauen, welchen .NET-Typ du an die Eigenschaft übergeben musst. Im schlimmsten Fall musst du das MsComm-Control selbst importieren, nämlich wenn der Tlb-Importer Mist gebaut hat (das kommt ab und zu vor). Wichtig ist eben, dass der Marshaller auf der COM-Seite die korrekten Typen erzeugt, also wie gefordert einen String-VARIANT oder einen Byte-Array-VARIANT.

    Kurz gesagt liegt der Fehler hier:
    - Du übergibst ein Objekt mit bestimmtem (falschem) Typ (hier Char)
    - Der Marshaller erzeugt daraus den falschen VARIANT
    - Das MsComm-Objekt gibt ein HRESULT zurück (0x800A017C)
    - Die CLR wirft eine COMException.

    Lösungsversuch:

    VB.NET-Quellcode

    1. 'Test 1
    2. MsComm1.Output = New String(Chr(&HC0))
    3. 'Test 2
    4. MsComm1.Output = New Byte() {&HC0}


    Wenn beides nicht geht, tritt der schlimmste Fall ein und du musst die Bibliothek manuell importieren :) .
    Gruß
    hal2000
    Ich würde ein SerialPort präferieren.
    Was ist denn die Gegenstelle für ein Ding?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    jones12 schrieb:

    Ja ich schreib von VB6 auf .Net um,
    Nicht, dass das die falsche Herangehensweise ist.
    Schreib das Programm völlig neu. :thumbup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Eierlein schrieb:

    Das bedeutet doch: Bei MsComm1.Output = Chr(&HC1) bekommt er keinen Fehler.
    Wohl kaum, denn nicht die Zahl, die nach Chr() konvertiert wird, macht den Fehler, sondern die Konvertierung nach Chr() als solche.
    Dazu müsste man wissen, was MsComm1.Output für einen Datentyp erwartet.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!