Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [c++]com e versioni

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]com e versioni

    Ciao.
    Ho 2 versioni dello stesso applicativo com.
    La v 12 e la v 11.
    Io finora ho letto dei dati dalla v. 11 e faccio:

    CLSID clsid;
    hr = CLSIDFromProgID(OLESTR("VID200.VIDObject"), &clsid);

    e in clsid ci finiva l'id giusto.

    adesso ho installato anche la verisione 12 e non so come accedere a questa(v12) o altra(v11)da programma .
    Ho provato a fare una ricerca nel registro ma non ho trovato un VID200.VIDOBject.11 o VID200.VIDOBject.12.

  2. #2
    Ciao Giuseppe,

    non serve accedere al vecchio componente com. Le versioni successive di un componente debbono necessariamente implementare le interfacce preesistenti nelle versioni precedenti. Possono aggiungere funzionalità e nuove interfacce ma, ripeto, chi aggiorna un componente com deve rispettare 'il contratto', e cioè le specifiche com che prevedono quanto detto prima.

    Ti consiglio il libro Inside COM di Dale Rogerson(forse non è più edito; vedi se riesci a trovarlo usato).


  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    quindi basta che accedo sempre alla stessa versione?
    Il problema è che se uso VID200.VIDObject non ottengo nessun clsid se è aperta la v12,mentre ottengo un clsid valido se è aperta la versione 11 forse perchè devo fare l'#import della versione 12?adesso uso un file .tlh generato da un precedente #import "filevid11.exe" dovrei quindi prima fare un #import "filevid12.exe" e poi usare il file tlh generato?
    puo' essere questo? grazie adesso provo.
    Per quanto riguarda la distribuzione?
    Ciao.

  4. #4
    Originariamente inviato da giuseppe500
    quindi basta che accedo sempre alla stessa versione?
    Il problema è che se uso VID200.VIDObject non ottengo nessun clsid se è aperta la v12,mentre ottengo un clsid valido se è aperta la versione 11 forse perchè devo fare l'#import della versione 12?adesso uso un file .tlh generato da un precedente #import "filevid11.exe" dovrei quindi prima fare un #import "filevid12.exe" e poi usare il file tlh generato?
    puo' essere questo? grazie adesso provo.
    Per quanto riguarda la distribuzione?
    Ciao.
    Puoi fare l'import senza bisogno di includere i file generati. Basta inserire la direttiva #import nel file stdafx.h. Ci pensa visual studio a tutto il resto.

    p. es. (nel file stdafx.h):

    #import "C:\PROGRAMMI\FILE COMUNI\SYSTEM\ADO\MSADOX.DLL"

    Per la distribuzione il componente com necessita la registrazione sulla macchina dell'utente. Puoi effettuarla a mano tramite il comandi RegSvr32 di Windows o richiamando la funzione dal programma di setup.

    Per esempio:

    codice:
    #include "stdafx.h"
    #include <stdio.h>
    #include <windows.h>
    
    typedef HRESULT (*PF_DllRegisterServer)(void);
    
    void MostraStringaErrore(DWORD dwErrore);
    int main(int argc, char* argv[]);
    
    void MostraStringaErrore(DWORD dwErrore)
    {
    	CHAR achBuffer[255];
    	CHAR str[500];
    
    	::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErrore, LANG_SYSTEM_DEFAULT, achBuffer, 255, NULL);
    	wsprintf(str, "Errore n° %ld (Esadecimale %x)\n\nDescrizione : %s", dwErrore, dwErrore, achBuffer);
    	::MessageBox(NULL, str, "Errore MyRegsvr", MB_ICONSTOP|MB_OK);
    }
    
    int main(int argc, char* argv[])
    {
        HINSTANCE hinstLib;
    	HRESULT hr;
        PF_DllRegisterServer pDllRegisterServer;
        BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
    	DWORD dwErrore;
    
    	if (argc <= 1 || argc > 3) {
    		printf("Modalita' d'uso del programma : \n");
    		printf("myregsvr nomelib [-u]\n");
    		printf("dove nomelib indica il nome di un file (.dll, .ocx, .exe) da registrare.");
    		printf("Usare l'argomento opzionale -u se si desidera deregistrare la libreria.");
    		return 1;
    	}
     
        hinstLib = ::LoadLibrary(argv[1]);
    	if (hinstLib == NULL) {
            printf("Impossibile caricare la libreria %s!\n", argv[1]);
    		dwErrore = ::GetLastError();
    		MostraStringaErrore(dwErrore);
            fRunTimeLinkSuccess = FALSE;
    	}
    	else
        {
            printf("La libreria %s e' stata caricata con successo!\n", argv[1]); 
    		if ( (argc == 3) && (strcmp(argv[2], "-u") == 0) )
                pDllRegisterServer = (PF_DllRegisterServer) GetProcAddress(hinstLib, "DllUnregisterServer");
    		else
                pDllRegisterServer = (PF_DllRegisterServer) GetProcAddress(hinstLib, "DllRegisterServer");
     
            if (fRunTimeLinkSuccess = (pDllRegisterServer != NULL)){
    			hr = (pDllRegisterServer)();
                if (FAILED(hr)){
    				dwErrore = ::GetLastError();
    				MostraStringaErrore(dwErrore);
                    fRunTimeLinkSuccess = FALSE;
    			}
    			else{
                    printf("La libreria %s e' stata registrata con successo!\n", argv[1]); 
    			}
    		}
     
            fFreeResult = FreeLibrary(hinstLib);
        } 
     
        if (! fRunTimeLinkSuccess) 
            printf("Impossibile registrare la libreria %s !\n", argv[1]); 
    
    	return 0;
    }
    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    forse perchè devo fare l'#import della versione 12?adesso uso un file .tlh generato da un precedente #import "filevid11.exe" dovrei quindi prima fare un #import "filevid12.exe" e poi usare il file tlh generato?
    puo' essere questo? grazie adesso provo.
    è corretto il ragionamento?
    poi...
    il problema Vincenzo è che lavoro in gruppo con sursafe , e non tutti hanno installato l'activex , è per questo che vorrei includere un file di intestazione.
    Basta condividere quel file e tutto dovrebbe essere ok senza installare l'eseguibile su tutte le macchine.

  6. #6
    Originariamente inviato da giuseppe500
    è corretto il ragionamento?
    poi...
    il problema Vincenzo è che lavoro in gruppo con sursafe , e non tutti hanno installato l'activex , è per questo che vorrei includere un file di intestazione.
    Basta condividere quel file e tutto dovrebbe essere ok senza installare l'eseguibile su tutte le macchine.
    Il ragionamento mi sembra corretto, si. Il file di intestazione va sicuramente aggiornato. Sursafe non lo conosco

    Ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Adesso ho un altro problema:
    Ho due activex exe ,a cui mi devo agganciare per eseguire le importazioni.
    Ho due versiioni quindi del programma , la 11 e la 12 .
    Il problema è che il file .tlh ha delle implementazioni del tipo:
    codice:
    struct __declspec(uuid("cb8acbcc-972a-4b7e-9298-714e74858332"))
    /* LIBID */ __VIC2000;
    struct __declspec(uuid("2a40f9e9-009e-4ff0-8151-e16e8c183066"))
    /* dual interface */ _cPointObj;
    struct /* coclass */ cPointObj;
    struct __declspec(uuid("5a1789be-5c2a-458d-aee7-1c98486bfdac"))
    /* dual interface */ _VICObject;
    struct /* coclass */ VICObject;
    struct __declspec(uuid("204b1370-803d-4647-b51f-e7f50e8bea43"))
    /* dual interface */ _cFile;
    struct /* coclass */ cFile;
    struct __declspec(uuid("9d46114c-6f85-4eec-a473-f29dfdbc8d18"))
    /* dual interface */ _cConstraint;
    struct /* coclass */ cConstraint;
    struct __declspec(uuid("118dfeae-026b-407d-bff4-79eb0ba6c44a"))
    /* dual interface */ _cCoordSys;
    struct /* coclass */ cCoordSys;
    dove i guid si riferiscono (sono quasi sicuro)a chiavi nel registro.
    Il problema è che dalla 11 alla 12 questi guid cambiano.
    come posso quindi fare qualcosa di genrico in modo da poter importare dalla v11 o dalla v12?
    grazie.

    questo è il codice della connessione all'exe:


    codice:
    HRESULT hr= CoInitializeEx(NULL, COINIT_MULTITHREADED);
    
    	hr = CLSIDFromProgID(OLESTR("VIC2000.VICObject"), &clsid); 
    	
    	hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,__uuidof(VIC2000::_VICObject),(void **)&m_pVIC);
    
    	m_pVIC->ApplicationStart(VIC2000::kN_m_C,TRUE, "");
    	
    	m_pVICModel = m_pVIC->GetVICModel();
    
    	long pNumberNames=0;
    se importo dalla v 12 tutto ok , se provo ad importare dalla 11 mi restituisce un errore:
    E_NOINTERFACE all riga:
    [ode]
    hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,__ uuidof(VIC2000::_VICObject),(void **)&m_pVIC);
    [/code]

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ho constatato che il problema è quando importo i due activex exe,questi importati definiscono due namespaces (anche nella visualizzazione delle classi com in visual studio)diversi
    uno
    sap2000
    e l'altro
    SAP2000

    è questo penso che genera l'errore , ma non è possibile utilizzare solo l'ultima versione dell activex?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    up

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.