Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » problem mit MS-COM und raw_fkts

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.01.2006, 14:30 Uhr
~_johannes
Gast


hi folkz,
ich hab ein problem, und zwar versuche ich eine funktion aufzurufen die ich via


C++:
#import "C:\Programme\ennovatis GmbH\Smartbox Manager\KENWOinterface.tlb" \
    raw_dispinterfaces, rename_namespace("std")
...
CoInitialize (NULL);
...
        hr = CoCreateInstance(
                     CLSID_IKENWOConnection ,
                     NULL,
                     CLSCTX_INPROC_SERVER,
                     IID_IKENWOConnection,
                     (void **) &_pIKenwoConnection);
        if (FAILED (hr))
                throw cMyComException ("cant create COM Object: IKENWOConnection", hr);
...
connected = _pIKenwoConnection->Connected();


aufrufe.

mein problem ist das das programm immer mit einer "obj-verweis wurde nicht auf eine obj-instanz festegeleg"-exception abstürzt. aber erst in Connected().
die exception wird geworfen sobald dort raw_Connected(&result) aufgerufen wird.

ich hab überhaupt keinen plan mehr wie was geht ... und der cheff sitzt mir im nacken
ich hoffe hier kann mir jemand helfen.


p.s.: fehlerbehandlung habe ich, aber der besseren lesbarkeit halber nicht gepostet.

greatz Johannes
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.01.2006, 15:24 Uhr
ao

(Operator)


Also, erst mal: Backslashes in Stringliteralen werden als Doppelbackslash geschrieben:

C++:
#import "C:\\Programme\\ennovatis GmbH\\Smartbox Manager\\KENWOinterface.tlb" \
    raw_dispinterfaces, rename_namespace("std")


Den Namespace nach std umbenennen ist gefährlich, denn den gibts schon woanders, Namenskollisionen sind möglich. Merkst du aber beim Kompilieren.

Dann, CLSCTX_INPROC_SERVER ist nur richtig, wenn der Server eine DLL (oder ein OCX) ist. Ist der Server eine Exe, dann ist CLSCTX_LOCAL_SERVER besser. Kannst aber auch CLSCTX_SERVER verwenden, das sollte immer gehen (außer bei Servern auf Remote-Rechnern).

Was passiert denn zwischen CoCreateInstance und Connected? Hast du da ein funktionierendes Objekt in der Hand?

Anstelle von nackten Interface-Pointern (IKenwoConnection * pConn) könntest du auch "Smartpointer" verwenden, es gibt z.B. CComPtr<IKenwoConnection> oder _com_ptr_t<IKenwoConnection>. Die kümmern sich für dich um die Referenzierung und die Lebenszeitkontrolle.

Gruß,
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.01.2006, 16:12 Uhr
~_johannes
Gast


ich hab mich an die reinen pointer gewöhnt, stand so in allen tutorials drin die ich im netzt gefunden habe.

zwischen coCreateInstanze und Connected() wird eine funktion (ISDNConnect()) aufgerufen welche auch via coCreateInstanze initialisiert wird (aber andere IID und CLSID, rest gleich).

die funktion arbeitet einwandfrei und hat als rückgabewert eben auch diese KENWOConnection.
ich habe es erst versucht IKENWOConnection nicht zu initialisieren sondern nur


C++:
this->pIKENWOConnection = this->pIKENWO->ISDNConnect(....);


aber das hat nicht funktioniert, da gab es schon eine Fehlermeldung wenn ich connected aufrufen wollte.
Seitdem ich IKENWOConnection via coCreateInstanze aufrufe und dann wie oben zuweise habe ich das im ersten posting beschriebene verhalten.

greatz Johannes
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.01.2006, 19:33 Uhr
ao

(Operator)



Zitat von ~_johannes:
ich hab mich an die reinen pointer gewöhnt, stand so in allen tutorials drin die ich im netzt gefunden habe.

Referenzierungs- und Lebenszeitfehler passieren aber sehr leicht, wenn das Programm komplizierter wird und die COM-Objekte hin- und hergereicht werden. Überlegs dir noch mal, es gibt diese Smartpointer nicht ohne Grund.

Wenn ISDNConnect kein gültiges Objekt zurückliefert, musst du mal überlegen oder in der Doku nachschlagen, woran das liegen kann. Verbindungsversuch fehlgeschlagen, hmmmm, vielleicht die falsche Rufnummer? Prüf mal, ob die Gegenstelle überhaupt erreichbar ist.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.01.2006, 21:20 Uhr
~_johannes
Gast


die rufnummer ist gültig, und das zurückgegebene object auch, sonst könnte ich Connectet() erst garnicht aufrufen, aber der fehler entsteht ja erst in connected weil da raw_connected() aufgerufen wird, welche den fehler verursacht.

greatz Johannes
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.01.2006, 21:41 Uhr
ao

(Operator)


Dann poste mal den Code von Connected().

Schon mal bei ennovatis nachgefragt, ob sie dir ein Stück Beispielcode schicken können?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.01.2006, 22:34 Uhr
~_Johannes
Gast


nein, da wollt ich nachfragen falls ich so keine lösung finde.

der code an sich ist recht simpel (ist so aus dem kopf rekonstruirt):


C++:
returntype IKenwoConnection::connected(){
//...
//hier wird result deklariert, hab grad kein plan wie, sind aber auch nur 2 zeilen
hresult _hr = raw_connected (&_result); //hier stürzt das programm ab
if (FAILED (_hr)) throw //eine exception
return _result;
}



cordbg liefert hr=E_POINTER.

ich hoffe es liegt daran das ich nur '\' anstatt '\\' verwende und deshalb die funktion nicht ordentlich gefunden werden.

greatz Johannes
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.01.2006, 09:21 Uhr
~_johannes
Gast


so. ich hab den genauen code der connected() nochmal:

C++:
inline _variant_t IKenwoConnection::Connected ( ) {
    VARIANT _result;
    VariantInit(&_result);
    HRESULT _hr = raw_Connected(&_result); //hier ensteht der fehler !!
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return _variant_t(_result, false);
}



die includanweisung habe ich angepasse '\\' anstat '\' aber hat nix geholfen

greatz Johannes
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: