Laden...

COM/ActiveX: "Use the applicable interface instead" ?

Erstellt von jmarti vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.914 Views
J
jmarti Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren
COM/ActiveX: "Use the applicable interface instead" ?

hallo zusammen

ich ursprünglich aus der java-welt, nun programmiere ich aber auch in c#.net.

nun habe ich eine com/activex-komponente verwendet (mscomdlg), für welche die passenden wrapper erstellt wurden.

es scheint jedoch so auszusehen, dass ich die klasse nicht instanzieren kann:

weder so

CommonDialogClass cd = new CommonDialogClass();

noch so

CommonDialog cd = new CommonDialogClass();

-> das gibt die meldung > Fehlermeldung:

Use the applicable interface instead des weiteren verfügt die wrapperklasse scheinbar über keinen konstruktor > Fehlermeldung:
...has no constructors defined und auch keine statische funktionen, bspw. eine factory-methode...

...scheinbar muss ich das interface instanzieren (hä??!), was mir sehr speziell erscheint:

CommonDialog cd = new CommonDialog();

sowas kenne ich aus der java-welt GAR NICHT. was passiert da dahinter? was ist, wenn mehrere klasssen das interface "CommonDialog" implementieren? was passiert da im hintergrund?

danke für eure feedbacks, bereits im voraus.

Freundliche Grüsse,
Jan

2.079 Beiträge seit 2012
vor 9 Jahren

Ein Interface ist bei C# ziemlich genau das gleiche, wie auch bei Java.
Es ist egal, ob mehrere Klassen das Interface implementieren, die sind von einander unabhängig, solange du keine ABhängigkeit schaffst. Instanzieren kann man ein Interface auch nicht und ich muss gestehen, ich finde die Meldung auch etwas seltsam.

Eventuell kann es sein, dass das Objekt einfach nicht von Außerhalb erstellt werden darf.
Entweder, weil es einfach so vorgegeben ist, oder es gibt eine andere Quelle, wo das benötigte Objekt dann erstellt wird. Also eine Factory, dann aber in einer extra Klasse.

Ich hab mal kurz gegoogled (ging im Übrigen sehr schnell ^^) und das gefunden:

VBA cannot create MSComDlg.CommonDialog ActiveX

Versuch mal etwas in der Art:

VBA.CreateObject("MSComDlg.CommonDialog")

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

J
jmarti Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

hallo Palladin007,

danke für dein feedback.

Instanzieren kann man ein Interface auch nicht und ich muss gestehen, ich finde die Meldung auch etwas seltsam.

ich auch, definitiv!

deswegen habe ich die sache nun mit dem "decompiler" ilspy angeschaut, und siehe da, das "interface" sieht so aus:

	[CoClass(typeof(CommonDialogClass)), Guid("083039C2-13F4-11D1-8B7E-0000F8754DA1")]
	[ComImport]
	public interface CommonDialog : ICommonDialog, ICommonDialogEvents_Event
	{
	}

interface und konkrete implementierung sind scheinbar 1:1 zueinander gebunden! somit sollte es einigermassen klar sein, was bei diesem (für meine sichtweise eher schrägen) konstrukt bei der instanzierung passiert...

na ja, gerade wieder was neues gelernt! danke für deine antwort und einen schönen tag!

Freundliche Grüsse,
Jan

H
523 Beiträge seit 2008
vor 9 Jahren

Falls Du das Control nicht zwangsweise verwenden musst, dann würde ich an Deiner Stelle eher die Dialog-Klassen von .NET verwenden. Z. B. System.Windows.Forms.CommonDialog

J
jmarti Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

habe ich vermutet dass es sicher was zeitgemässeres gibt, danke für deine antwort.

dafür hab ich was neues gelernt, immerhin! 😉

Freundliche Grüsse,
Jan

656 Beiträge seit 2008
vor 9 Jahren

Nur zur Info, das CoClassAttribute sorgt dafür, dass du new InterfaceXxx() schreiben kannst/darfst. In der Praxis braucht man das aber nur in Zusammenhang mit COM, und selbst dann wirds eher generiert als selber geschrieben.

Aber wie bereits gesagt, nimm lieber die Alternativen, die direkt im Framework verfügbar sind; wenn du nicht grade einen guten Grund hast um trotzdem über COM/PInvoke/sonstwas reinzugehen.

J
jmarti Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

VBA.CreateObject("MSComDlg.CommonDialog"); scheint bei mir "per default" nicht zu funktionieren.

muss ich dafür irgendwelche assemblies zum projekt hinzufügen?

Freundliche Grüsse,
Jan

5.658 Beiträge seit 2006
vor 9 Jahren

Hi jmarti,

eine Fehlermeldung wäre nicht schlecht für eine Ferndiagnose. Hast du schonmal gegoogelt? Ich hab diesen Artikel dazu gefunden: VBA cannot create MSComDlg.CommonDialog ActiveX .

This particular component can be used in a custom application only if properly licensed and Microsoft provides the license for this component only if you are running a developer’s version of Office or of Visual Studio

Christian

Weeks of programming can save you hours of planning

J
jmarti Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

hi!

soweit ich mich erinnern kann: die Klasse "VBA" scheint schlicht nicht zu existieren.

was mich nicht verwundert bei c#; ich denke die passende assembly zu inkludieren würde das problem lösen. nur weiss ich leider nicht, welche assembly die klasse "VBA" enthält...?

Freundliche Grüsse,
Jan

309 Beiträge seit 2008
vor 9 Jahren

VBA steht auch für Visual Basic for Applicatios. (Excel, Word Scripting). Darauf bezieht sich auch der verlinkte Artikel.

Hast du die COM Interop Tutorials schon gelesen?
Da steht eigentlich alles wissenswerte zu COM Objekten drin.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

J
jmarti Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

dann ist also die klasse "VBA" in c# nicht verfügbar? oder kann eine entsprechende assembly dafür verwendet werden?

Freundliche Grüsse,
Jan

1.696 Beiträge seit 2006
vor 9 Jahren

Hallo,

mit VBA kannst du kein COM erstellen, denn VBA läuft z.B. nur in Office-Umgebung. Wenn du COM erstellen möchtest, dann nimm echte Visual Basic, z.B. VB6, aber nicht Visual Basic for Application (VBA).

Andererseits du kannst VBA von C# aus aufrufen, indem du z.B. zunächst ein Objekt von der Office-Anwendung erstellst, damit dann über dieses Objekt den VBA-Code ausführen Excel VBA mit C# ausführen

Grüße

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

J
jmarti Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

das ist mir bewusst. c++ oder j++ pro version aus vs6 würden auch gehen. COM/active-sachen selber erstellen tu ich ohnehin nicht...

Es stellt sich noch immer die frage, in welcher assembly die klasse "VBA" ist, womit man scheinbar VBA-sachen aus c# heraus ausrufen kann?

Freundliche Grüsse,
Jan

1.696 Beiträge seit 2006
vor 9 Jahren

IMHO arbeitet VBA wie ein Interpreter und nicht wie Compiler, d.h. der Code wird on the fly ausgeführt, daher kannst du kein Assembly finden können.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

J
jmarti Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

danke fürs feedback!

Freundliche Grüsse,
Jan