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.