Pointer ohne Member
-
Kennt der Compiler denn überhaupt die Definition der Struktur
SafeTaskItem
? Oder hast du nur eine Forward-Deklaration spendiert?(außerdem solltest du beim Zugriff auch angeben, welches Strukturelement du eigentlich verwenden willst)
-
Ich hoffe zur Klarheit hier mal den gesamten Code. Bin da wirklich unsicher, was Pointer und C++ Syntax im Allgemeinen angeht.
// 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-> .... geht nicht .. ist IntelliSence-rot unterstrichen return 0; }
Ich kann über session-> einfach auf nichts zugreifen.
-
#import?
-
Ja?
Bei einer Dll empfielt sich das wohl oder?
-
Was ist das?
-
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.
-
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.