2013-08-13 2 views
1

J'ai créé une application de console win32 qui importe un fichier ".ocx" à partir du kit de développement logiciel geovision. J'ai trouvé le CLSID et l'ID d'interface des composants COM dans les en-têtes ".tli" et ".tlh" générés et tout fonctionne jusqu'à ce que j'appelle une méthode (Login2 par exemple dans mon code ci-dessous). Puis _com_exception se produit et il ne donne aucune information détaillée sur ce qui se passe exactement.Utilisation des méthodes COM dans l'application console

Quelqu'un peut-il me donner un indice que dois-je faire ensuite ou où devrais-je chercher une solution? Il m'a fallu plus d'une semaine pour atteindre ce point d'utilisation des composants COM dans l'application console ... J'espère que c'est possible de le faire.

#include "stdafx.h" 
#include "stdio.h" 

#import "C:\Windows\GeoOCX\SinglePlayer\20121003\GVSinglePlayer.ocx" \ 
     named_guids no_namespace no_smart_pointers 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    try 
    { 
     CoInitialize(NULL); 
     _DGVSinglePlayer* pSP = 0; 
     HRESULT hr = CoCreateInstance(CLSID_GVSinglePlayer ,NULL, CLSCTX_INPROC_SERVER,DIID__DGVSinglePlayer,reinterpret_cast <void**>(&pSP)); 

     _bstr_t lpIPAddress("11.11.11.11"); 
     long iPort=10000; 
     _bstr_t lpUserID("abcde"); 
     _bstr_t lpPassword("password"); 

     if (SUCCEEDED (hr)) 
     { 
      hr = pSP->Login2(lpIPAddress,iPort,lpUserID,lpPassword); 
      if (SUCCEEDED (hr)) 
      { 
       printf("Cool"); 
      } 
     }else 
     { 
     } 
     pSP->Release(); 
     CoUninitialize(); 

    } catch (_com_error& e) 
    { 
     char buf[80]; 
     sprintf(buf, "Error: %S",e.Description()); 
     printf("%s\n",buf); 
    } 

    return 0; 
} 

Depuis e.Description() imprime pas d'info, j'attatched informations visuelles sur l'erreur.

error messages

+0

Que retourne 'CoCreateInstance'? Ne testez pas en utilisant la macro 'SUCCEEDED', mais plutôt avec' S_OK == hr'. Une méthode peut renvoyer 'S_FAILED' et la macro' SUCCEEDED' va évaluer TRUE. –

+0

il retourne S_OK – narr

+0

E_UNEXPECTED est un rapport d'erreurs bâclé. La seule chose précise à ce sujet est que vous ne l'attendiez pas non plus. Je suppose que vous devez donner une meilleure adresse IP, numéro de port et nom d'utilisateur + mot de passe pour obtenir quelque part. Ce que vous avez utilisé ressemble à une supposition aléatoire. Contactez l'auteur de ce code si vous avez besoin d'aide. –

Répondre

2

De nombreux contrôles ActiveX veulent être correctement hébergé (sens, l'hôte implémente IOleClientSite et interfaces connexes, et passe le pointeur sur IOleObject::SetClientSite de la commande). De tels contrôles renvoient E_UNEXPECTED pour tous les appels de méthode jusqu'à ce que la danse d'activation OLE soit effectuée.

En particulier, les contrôles ActiveX développés avec MFC se comportent généralement de cette façon; le comportement est cuit dans le cadre MFC. Je soupçonne que votre contrôle pourrait être l'un de ceux-ci. Dans ce cas, vous ne seriez pas capable de l'utiliser facilement dans une application de console. Vous auriez besoin d'une application fenêtrée utilisant un framework qui implémente l'hébergement ActiveX (MFC, ATL, WinForms, d'autres existent probablement que je ne connais pas).

+0

bien, merci, cela peut être un bon indice et peut-être même la réponse à tout mon problème mais honnêtement, je voulais vraiment éviter ce genre de solution. Je vais essayer d'en savoir plus sur ces ActiveX "incompatibles" – narr

Questions connexes