Laden...

COM Interop Problem Sage Office Line: Objekt von Access -> .Net

Erstellt von Ace86 vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.256 Views
A
Ace86 Themenstarter:in
15 Beiträge seit 2012
vor 12 Jahren
COM Interop Problem Sage Office Line: Objekt von Access -> .Net

Hallo,

ich möchte eine Erweiterung für die Sage Office Line in .Net programmieren. Da die OL auf Access basiert, denke ich passt dieses Unterforum am besten.

Zu meinem Problem: Die OL stellt eine Reihe von Objekten über DLLs zur Verfügung. Ich versuche gerade das Mandanten-Objekt aus einem Access Addin an ein .Net Projekt zu übergeben, was einfach nicht funktionieren will.
Ich habe mir zum Test eine COM-Interop in C# geschrieben, im .Net Framework 4.0. Hier der Quellcode:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Importtool.Interop
{
    [Guid("C89D342D-7E41-42BF-867C-62259988C206")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IImport
    {
        [DispId(1)]
        void ShowImporttool(int Mandant);
        [DispId(2)]
        void ShowImporttool(OLSysIInterop60.Mandant Mandant);
        [DispId(3)]
        void ShowImporttool(Sagede.OfficeLine.Engine.Mandant Mandant);
        [DispId(4)]
        void ShowImporttool(Sagede.OfficeLine.Interop60.Mandant Mandant);
    }

    [Guid("E2C4C00C-2950-4EC7-92A0-F2675153FF08")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("ComInterOpClass")]
    public class Importtool : IImport
    {
        [STAThread]
        public void ShowImporttool(int Mandant)
        {
            MainWindow win = new MainWindow();
            win.setMandant(Mandant);
            win.Show();
        }

        [STAThread]
        public void ShowImporttool(OLSysIInterop60.Mandant Mandant)
        {
            MainWindow win = new MainWindow();
            win.setMandant(Mandant);
            win.Show();
        }

        [STAThread]
        public void ShowImporttool(Sagede.OfficeLine.Engine.Mandant Mandant)
        {
            MainWindow win = new MainWindow();
            win.setMandant(Mandant);
            win.Show();
        }

        [STAThread]
        public void ShowImporttool(Sagede.OfficeLine.Interop60.Mandant Mandant)
        {
            MainWindow win = new MainWindow();
            win.setMandant(Mandant);
            win.Show();
        }   
    }
}

Wie gesagt es ist erstmal nur ein Test. MainWindow ist eine WPF Anwendung die gestartet werden soll, was auch soweit funktioniert. Im Access habe ich mir simples Formular mit 4 Buttons erstellt, die die einzenlen Funktionen aufrufen:


Private Sub Befehl1_Click()
    Dim frmImport As Importtool_Interop.Importtool
    Set frmImport = New Importtool_Interop.Importtool
    frmImport.ShowImporttool (goMandant.nID)
    
End Sub

Private Sub Befehl2_Click()
    Dim frmImport As Importtool_Interop.Importtool
    Set frmImport = New Importtool_Interop.Importtool
    frmImport.ShowImporttool_2 (goMandant)

End Sub

Private Sub Befehl3_Click()
    Dim frmImport As Importtool_Interop.Importtool
    Set frmImport = New Importtool_Interop.Importtool
    frmImport.ShowImporttool_3 (goMandant)
    
End Sub

Private Sub Befehl4_Click()
    Dim frmImport As Importtool_Interop.Importtool
    Set frmImport = New Importtool_Interop.Importtool
    frmImport.ShowImporttool_4 (goMandant)
    
End Sub

Leider Funktioniert nur der erste Aufruf. Diesen habe ich eingebaut um die generelle Funktionsweise zu prüfen. Die ID des Mandanten allein nützt mir aber noch nicht so viel, ich benötige das gesamte Objekt. Bei den anderen 3 Aufrufen kommt immer folgende Meldung:

Laufzeitfehler '438':
Objekt unterstützt diese Eigenschaft oder Methode nicht

Die 3 Funktionen erwarten einen Parameter vom Typ Mandant (was auch im Access angezeigt wird) und der goMandant ist vom Typ Mandant. Ich weiß im Moment nicht wo das Problem liegen kann, ich versuche das schon den ganzen Tag zum Laufen zu bringen, leider ohne Erfolg. Ich muss auch dazu sagen, dass ich vorher noch nie COM-Objekte erstellt habe.

MfG Ace

A
Ace86 Themenstarter:in
15 Beiträge seit 2012
vor 12 Jahren

Ich habe nun doch eine Lösung für das Problem gefunden. Das Problem ist einfach, dass die Methoden der Interop keinen Rückgabewert haben. Da VBA "erfreulicherweise" zwischen Funktionen mit und ohne Rückgabewert unterscheidet, muss man diese im VBA entweder mit call aufrufen oder die Klammern bei den Parametern weglassen. Warum der Aufruf der ersten Funktion trotzdem funktioniert hat, weiß ich nicht, aber scheinbar ist VBA an dieser Stelle tolerant.
Jetzt weiß ich wieder warum ich VBA nicht mag.