Pointer ohne Member
-
Wenn ich das so kompliere, dann erhalte ich die Fehlermeldungen Unten.
// OutlookRedemption.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #import "C:\Programme\Redemption\Redemption.dll" using namespace Redemption; int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr = CoInitialize(NULL); CLSID clsid; Redemption::RDOSession *session; hr = CLSIDFromProgID(OLESTR("Redemption.RDOSession"), &clsid); hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (LPVOID*)&session); session->Logon(); return 0; }
1> OutlookRedemption.cpp 1>OutlookRedemption.cpp(19): error C2027: Verwendung des undefinierten Typs "Redemption::RDOSession" 1> c:\vse_projekte\outlookredemption\outlookredemption\release\redemption.tlh(294): Siehe Deklaration von 'Redemption::RDOSession' 1>OutlookRedemption.cpp(19): error C2227: Links von "->Logon" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden. ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Die Meldung sagt doch wo das Problem liegt! Wie CStoll schon gesagt hat, benötigt man einen Header zu der .dll-Datei, die alles deklariert.
-
CStoll schrieb:
EOutOfResources schrieb:
#import?
Kenne ich auch nicht
@IceRage: Wie du an der Färbung des Codes erkennen kannst, kennt C++ keine #import-Direktive. Du benötigst schon einen Header, der die verwendeten Klassen und Funktionen deklariert und den du dann per #include einbinden mußt.
Bei dem Framwork ist kein Header dabei. Der Entwickler selbst meint, dass mein Code soweit richtig aussieht, und dass das so geht.
Hatte heute schon Emailkontakt mit Dmtry Streblechenko. Wobei ich natürlich sagen muss, dass auch jeder Andere geantwortet haben könnte.
Also ohne Header läuft nix? Ich kann keine Dll in C++ einbinden?
Edit: Rechtschreibfehler
-
Hörst du überhaupt zu? Wenn nicht uns, dann wenigstens deinem Compiler. Und der sagt dir dort ganz deutlich, daß er keine Ahnung hat, wie ein
Redemption::RDOSession
aufgebaut ist.
(wenn du die zweite Zeile der Fehlermeldung anklickst, landest du vermutlich bei einemclass RDOSession;
)
-
CStoll schrieb:
Hörst du überhaupt zu?
Du weißt schon, dass so eine Forendiskussion zeitversetzt läuft?
Also wie gesagt: Bei dem Dll Packet von Outlook Redemption ist keine HeaderDatei dabei ... Dann hat der Entwickler wohl vergessen eine mit auszuliefern???
-
IceRage schrieb:
CStoll schrieb:
Hörst du überhaupt zu?
Du weißt schon, dass so eine Forendiskussion zeitversetzt läuft?
Ja, ich hab' schon gemerkt, daß das hier zu schnell geht
Also wie gesagt: Bei dem Dll Packet von Outlook Redemption ist keine HeaderDatei dabei ... Dann hat der Entwickler wohl vergessen eine mit auszuliefern???
Da du ja sowieso schon Kontakt mit ihm hast, kannst du ihn ja um einen Header bitten.
-
CStoll schrieb:
IceRage schrieb:
CStoll schrieb:
Hörst du überhaupt zu?
Du weißt schon, dass so eine Forendiskussion zeitversetzt läuft?
Ja, ich hab' schon gemerkt, daß das hier zu schnell geht
Ja genau und zwischen Schnelligkeit und Qualität liegen ja auch oft Welten :D:D:D
Also wie gesagt: Bei dem Dll Packet von Outlook Redemption ist keine HeaderDatei dabei ... Dann hat der Entwickler wohl vergessen eine mit auszuliefern???
Da du ja sowieso schon Kontakt mit ihm hast, kannst du ihn ja um einen Header bitten.
Also 1. hatte ich ZU ihm Kontakt, und nicht MIT ihm. Das solltest du verstehen können.
2. WENN zur Verwendung der Dll ein Header nötig wäre, dann wäre dieser wohl auch im Rahmen der Developerversion mit ausgeliefert worden oder? Oder noch mal ganz deutlich: Es gibt keine Headerdatei im Rahmen der Entwicklertätigkeit unter Redemption. Das sollte aus dem Vorhergesagten hervorgehen.
-
Vielleicht in diesem Zusammenhang noch mal hier nachlesbar (http://www.c-plusplus.net/forum/286129). Da hätte dann der hochverehrte Herr Martin Richter irgendwie Fehl- oder wenigstens Halbauskünfte gegeben.
-
IceRage schrieb:
Also 1. hatte ich ZU ihm Kontakt, und nicht MIT ihm. Das solltest du verstehen können.
Wenn wir schon soweit sind: DLL ist eine englische Abkürzung, also entweder alles gross oder alles klein schreiben.
-
EOutOfResources schrieb:
IceRage schrieb:
Also 1. hatte ich ZU ihm Kontakt, und nicht MIT ihm. Das solltest du verstehen können.
Wenn wir schon soweit sind: DLL ist eine englische Abkürzung, also entweder alles gross oder alles klein schreiben.
Sagt mal habt ihr beiden Honks auch noch inhaltliche Beiträge zu liefen, ganz ohne Herabwürdigungen, in neutraler Weise, zielführen und hilfreich, was eigentlich die Qualität eines solchen Forums ausmacht?
Ich habe ja schon viel erlebt, in vielen Foren. Aber das ein Moderator und ein Hilfshonk sich derart vergehen ist mir echt mal was ganz Neues. Gewöhnlich ignoriere ich Deppen wie euch einfach, und hoffe auf hilfreich gemeinte, inhaltlich orientierte Beitrgäge. Aber scheinbar gehören Verfasser derartige Beiträge hier zur Liste der Mangelexemplare.
Also falls sich hier noch jemand inhaltlich mit der Problematik befassen möchte, bin ich gern dabei. Alles Weiter geschwafel ignoriere ich ab jetzt. Was natürlich nicht die inhaltliche Aussagen bisher einschließt. Somit kommt man zu der Frage: Warum wurde keine Headerdatei bei Redemption mitgeliefert? Geht es also auch ohne Headerdatei, oder nicht???
Kann man am Ende Redemption gar nicht in C++ verwenden, weshalb auch die Pointer ins Leere laufen???
Gruß, IceRage
-
Du weist es mal wieder besser, aber OK. Nein! ISO-C++ kennt die Präprozessordirektive "import" nicht (was eigentlich schon oft genug erwähnt wurde! Und nein! Ohne Header keine DLL!
-
IceRage schrieb:
EOutOfResources schrieb:
IceRage schrieb:
Also 1. hatte ich ZU ihm Kontakt, und nicht MIT ihm. Das solltest du verstehen können.
Wenn wir schon soweit sind: DLL ist eine englische Abkürzung, also entweder alles gross oder alles klein schreiben.
Sagt mal habt ihr beiden Honks auch noch inhaltliche Beiträge zu liefen, ganz ohne Herabwürdigungen, in neutraler Weise, zielführen und hilfreich, was eigentlich die Qualität eines solchen Forums ausmacht?
Ich habe ja schon viel erlebt, in vielen Foren. Aber das ein Moderator und ein Hilfshonk sich derart vergehen ist mir echt mal was ganz Neues. Gewöhnlich ignoriere ich Deppen wie euch einfach, und hoffe auf hilfreich gemeinte, inhaltlich orientierte Beitrgäge. Aber scheinbar gehören Verfasser derartige Beiträge hier zur Liste der Mangelexemplare.
Also das nehme ich jetzt persönlich. Ich weiß selbst recht gut, wann ich mit meinem Wissen am Ende bin, deshalb wollte ich mich eigentlich aus dem weiteren Thread heraushalten.
Also falls sich hier noch jemand inhaltlich mit der Problematik befassen möchte, bin ich gern dabei. Alles Weiter geschwafel ignoriere ich ab jetzt. Was natürlich nicht die inhaltliche Aussagen bisher einschließt. Somit kommt man zu der Frage: Warum wurde keine Headerdatei bei Redemption mitgeliefert? Geht es also auch ohne Headerdatei, oder nicht???
Sorry, so gut kenne ich mich weder mit COM noch mit Redemption aus, um diese Frage zu beantworten. Ich weiß nur, daß ein normaler C++ Compiler erwartet, daß du ihm erklärst welche Datentypen du benötigst und wie diese aussehen. Wie du das Problem ohne einen Header lösen kannst, wissen wohl nur die Leute, die diese DLL entwickelt haben.
-
IceRage schrieb:
Kann man am Ende Redemption gar nicht in C++ verwenden, weshalb auch die Pointer ins Leere laufen???
Mit mehr Fragezeichen geht es nicht besser! Du kannst keinen Zeiger auf einen nichtexistierende Typ machen! Er wird auch nicht "ins Leere laufen" wie du es nennst. Er kann schlicht und einfach nicht erzeigt werden!
-
@IceRage: du bist im falschen Forum. Hier ist das (ISO) C++ Forum. Dein Thread gehört ins MFC/Visual C++ Forum, da sich deine Frage um MSVC-spezifische Extensions dreht.
#import
ist eine MSVC-spezifische Extension. Dabei wird ein Type-Library File, oder auch eine .DLL mit "eingebauter" Type-Library geparsed, und automatisch die darin definierten COM Interfaces definiert. Zusätzlich werden Wrapper-Klassen erstellt die z.B. COM Properties als "Properties" (eine weitere MSVC-spezifische Extension) der Wrapper-Klassen erscheinen lassen.
Die Wrapper-Klassen machen auch aus COM Error-Codes Exceptions (_com_error
).Und für COM Klassen die nur eine IDispatch Schnittstelle anbieten (also keine "normalen" Interfaces implementieren) werden - wenn ich mich richtig erinnere - auch entsprechende Wrapper-Klassen definiert.
Die
#import
Direktive sieht OK aus.Was nicht mehr OK aussieht ist dieser Teil hier:
HRESULT hr = CoInitialize(NULL); CLSID clsid; Redemption::RDOSession *session; hr = CLSIDFromProgID(OLESTR("Redemption.RDOSession"), &clsid); hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (LPVOID*)&session);
Das müsste IMO so aussehen:
HRESULT hr = CoInitialize(NULL); Redemption::RDOSessionPtr session(L"Redemption.RDOSession");
Danach solltest du mit
session->Foo()
deine Funktionen aufrufen können.
Bin mir aber nicht 100% sicher, schon zu lange her dass ich ne Type-Library mit reinen Dispatch-Interfaces mit#import
verwendet habe.Ansonsten guck dir die (beim compilieren) generierten .tlh und .tli Files an. Die sollten im Debug bzw. Release Verzeichnis zu finden sein, bzw. halt dort wo die ganzen .obj Files liegen.
Da drinnen siehst du welche Klassen MSVC in der DLL gefunden hat, wie sie heissen, welche Member-Funktionen sie haben etc.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
hustbaer schrieb:
@IceRage:
Was nicht mehr OK aussieht ist dieser Teil hier:HRESULT hr = CoInitialize(NULL); CLSID clsid; Redemption::RDOSession *session; hr = CLSIDFromProgID(OLESTR("Redemption.RDOSession"), &clsid); hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (LPVOID*)&session);
Das müsste IMO so aussehen:
HRESULT hr = CoInitialize(NULL); Redemption::RDOSessionPtr session(L"Redemption.RDOSession");
Danach solltest du mit
session->Foo()
deine Funktionen aufrufen können.
Bin mir aber nicht 100% sicher, schon zu lange her dass ich ne Type-Library mit reinen Dispatch-Interfaces mit#import
verwendet habe.Ansonsten guck dir die (beim compilieren) generierten .tlh und .tli Files an. Die sollten im Debug bzw. Release Verzeichnis zu finden sein, bzw. halt dort wo die ganzen .obj Files liegen.
Da drinnen siehst du welche Klassen MSVC in der DLL gefunden hat, wie sie heissen, welche Member-Funktionen sie haben etc.Das bringt leider auch nicht den gewünschten Erfolg. Kann natürlich auch sein, dass ich da noch etwas anderes flasch mache. Wenn ich RDOSessionPtr verwenden will, dann wird mir über IntelliSence keine solcher Pointer auf eine Klasse angeboten. Außerdem erscheint RDOSessionPtr im Code rot unterstrichen mit dem ToolTip Hinweis: Namespace "Redemption" hat keinen Member ...
[unsachlich]Ich möchte mal wissen wer so eine sperrige Scheisse programmiert! unfassbar!!! Da funktioniert nichts!!![/unsachlich]
@hustbaer
Wenn du noch eine Idee hast, wie der granze Kram doch noch zur Funktion überredet werden könnte, dann versuch ich das gern noch mal. Erstmal vielen Dank für deine Hilfe.Evtl. OT:
Hier noch mal eine Aussage des Entwicklers/Entwicklerteams?, um Redemption. Ich würde das gern hier posten, weil es ja schon in engem Zusammenhang mit dem Threadinhalt steht. Sonst möge man es einfach verschieben.Bezüglich der Frage der Header, die von den Beiden hier "gestellt" wurde (Quelle: Email):
Dmtry Streblechenko schrieb:
[...]When you use #import to import the Redemption type library, it creates a header file.[...]
-
hustbaer schrieb:
@IceRage:
Ansonsten guck dir die (beim compilieren) generierten .tlh und .tli Files an. Die sollten im Debug bzw. Release Verzeichnis zu finden sein, bzw. halt dort wo die ganzen .obj Files liegen.
Da drinnen siehst du welche Klassen MSVC in der DLL gefunden hat, wie sie heissen, welche Member-Funktionen sie haben etc.Das wird mir ja alles über IntelliSence angezeigt. Zumindest gehe ich mal davon aus, dass auch wirklich alles angezeigt wird, was ich nicht 100%ig wissen kann.
Es tut nur einfach nicht was es soll! Das nervt echt!
-
Hallo IceRage,
versuch es mal so:
#import "C:\\Programme\\Redemption\\Redemption.tlb"
denn der Entwickler sagt:
When you use #import to import the Redemption type library
die type library hat aber die extension tlb und nicht dll.
Herzliche Grüsse
Walter
-
Die tlb liegt dem Projekt leider gar nicht bei. Ich weiß nicht, ob das der Fall sein müsste damit es nach deinem Vorschlag funktionieren kann, oder ob vs express selbst eine tlb anlegt ... kA leider. Im Order unter Programme zumindest liegt weiterhin ausschließlich die dll Datei. Außerdem bekomme ich leider weiterhin "keine Member vorhanden" angezeigt.
Trotzdem Danke für deine Hilfe. Vielleicht wirds ja doch noch was. Wobei ich schon ein Beispiel mit Extende MAPI zu verstehen versuche, was scheinbar erfolgversprechender ist, da es besser dokumentiert ist als Redemption.
Der Entwickler ist scheinbar auch nicht bereit, auch nur ein winziges stückchen Code heraus zu geben. Also hat sich das mit Redemption für mich schon fast erledigt. Wobei man das ja sicher ganz einfach die Beispiele in VB nach C++ übersetzen kann
-
Hallo IceRage,
ja, die Redemption.tlb müsste dem Projekt beiliegen. Frag doch den Entwickler danach.
Der Entwickler ist scheinbar auch nicht bereit, auch nur ein winziges stückchen Code heraus zu geben.
Das ist eigentlich schon der Sinn der COM Komponenten
Herzliche Grüsse
Walter