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
utilizzo :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); }
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.

Rispondi quotando