ciao.
Sto lavorando su un progetto che importa dei dati tramite com , il client(il mio programma) si interfaccia con un server com .exe.
Creo un tli e un tlh con questo import:

#import "C:\Programmi\Computers and Structures\SAP2000 14\sap2000.exe" no_namespace

a questo punto ho un cambiamento : il vecchio namespace del progetto che si interfacciava con il server com è differente , ma solo come nome , poi le funzioni sono identiche sia come nome sia come parametri.

Quello che voglio fare adesso è creare un progetto che si interfacci con la versione 14 se ho installato la versione 14 sulle macchine su cui è distribuito il progetto e con la 15 se è installata la versione 15 sulle macchine in cui è distribuito il progetto.

Le funzioni ribadisco sono identiche , quello che cambia sono il namespace e il tli e il tlh.

poi ,quando creo un istanza

codice:
UINT CBaseApiSapData::Init(CString* pFile, int * pnMaxBeamObj, int * pnMaxShellObj, int * pnMaxJointsObj, int *pCountDynCase,CString * pStrFORCE,CString * pStrLENGTH, CString * pStrTEMPERATURE, UINT iImportationType, double *pDVersion)
{
	HRESULT hr;
	CoInitialize(NULL);
	m_IstanceSap = 0;
	m_iImportationType = iImportationType;
	m_IstanceSap = ::FindWindow(CLASS_NAME_SAP2000, NULL);	
	CLSID clsid; 

	IUnknown *punk;
	IID id;
	hr = CLSIDFromProgID(L"Sap2000v15.SapObject", &clsid);
	IUnknown *pUnk = NULL;
	hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,IID_IUnknown, (void **)&punk);
	
	//hr = IIDFromString(L"B5800D6F-546D-4E23-ACEC-81850D4D6936",&id);
	hr = IIDFromString(L"{B5800D6F-546D-4E23-ACEC-81850D4D6936}",&id);

	hr = punk->QueryInterface(id, (void**)&m_pSap);
	m_pSapModel = m_pSap->SapModel;

	//leggo la versione e la metto in nVersion
	_bstr_t strVersion = "";
	double nVersionNumber = 0;
	
	m_pSapModel->GetVersion(&strVersion.GetBSTR() ,pDVersion);
	AfxMessageBox( strVersion);
	//	hr = CLSIDFromProgID(L"Sap2000v15", &clsid);
//	hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)&punk) ;
	
	
	//se il server com ritorna un errore probabile versione Sap 11
	if(FAILED(hr))
		return API_ERR_INIT_FAILED;
	
	//Lancio sap2000 se è chiuso , carico il file .sdb e importo
	
	AfxOleGetMessageFilter()->SetMessagePendingDelay(0);
	AfxOleGetMessageFilter()->EnableNotRespondingDialog(FALSE);
	AfxOleGetMessageFilter()->EnableBusyDialog(FALSE);

	if(iImportationType == IMPORTER_API_START_SDB)
	{
		//controllo che non ci sia un altra istanza di sap
		
		if(m_IstanceSap != 0){
			//ritorno errore non instanziato sap2000
			return API_ERR_INSTANCE_RUNNING;
		}
		
		_bstr_t bstrFile = *pFile;
	
		hr = m_pSap->ApplicationStart(SAP2000v15::kN_m_C, VARIANT_TRUE, bstrFile);
	}
utilizzo :

hr = CLSIDFromProgID(L"Sap2000v15.SapObject", &clsid);

oppure :

hr = CLSIDFromProgID(L"Sap2000.SapObject", &clsid);
quest' ultima si interfaccia con la versione maggiore installata e quindi andrebbe tutto bene.

il problema maggiore secondo me è l'interfaccia, io utilizzo un guid letto dal visualizzatore di oggetti com di vs 2003.
è sempre uguale questo guid per tutte le versioni 14 installate sulle macchine ?E quello della versione 15 è uguale su tutte le macchine che hanno installato la versione 15 o cambia?

vorrei evitare di andare a cercare sul registro i guid dell interfaccia , è possibile?

grazie.