Добрый день всем!
Собственно, сабж. Есть ДЛЛ или ОСХ, нужно создать объек без регистрации библиотеки.
Рабочий пример как это сделать исключительно на ВБ6 я нашел на vbstreets, но создать объект хочу на С++ и вернуть его вызывателю в ВБ. Тут начинаются грабли. С++ код отрабатывает, но в ВБ вызов метода возвращенного объекта , в лучшем случае приводит к выходу из процедуры, в худшем — Access Voilation. Повторюсь, что аналогичный код, написаный на ВБ работает.
Кусок ф-ции создания объекта:
IUnknown* __stdcall CreateObjectFromFile(LPCOLESTR strLibrary, LPCOLESTR strClassName,/*для отладки*/ DWORD * ResPtr)
{
char s[20];
//ResPtr = new DWORD [20];
DWORD i;
IUnknown* newobj = NULL;
IClassFactory* udtCF;
GUID classid;
//GUID IID_ClassFactory = IID_IClassFactory ;
HMODULE hModule;
DLLGETCLASSOBJECT pFunc;
COCLASSARR udtCoCls;
PCOCLASS tmpCo;
DWORD f=0;
HRESULT hRes;
if (!GetCoClasses(strLibrary,&udtCoCls)){i=1; goto RetN; //return NULL;}
for (f=0; f<udtCoCls.size(); f++)
{tmpCo = udtCoCls[f];
if (wcscmp(strClassName, tmpCo->Name )==0)
{
RtlMoveMemory(&classid,&udtCoCls.at(f)->guid,sizeof(GUID));
break;
}
}
if (f == udtCoCls.size()) {i=2;goto RetN;} //return NULL;}
hModule = GetModuleHandleW(strLibrary);
if (hModule == 0)
{
hModule = LoadLibraryW(strLibrary);
if (hModule == 0) {i=3; goto RetN;} //return NULL;
}
pFunc = (DLLGETCLASSOBJECT)GetProcAddress(hModule,"DllGetClassObject");
memcpy(&ResPtr[0],&pFunc,4);//debug
if (pFunc==0) {i=4; goto RetN;} //return NULL;
hRes = pFunc(classid,IID_ClassFactory,(void**)&udtCF);
memcpy(&ResPtr[1],&udtCF,4);//debug
if ( udtCF == NULL){i=5; goto RetN; //return NULL;}
hRes = udtCF->CreateInstance (NULL,IID_IUnknown,(void**)&newobj) ;
if (hRes != 0) {udtCF->Release ();i=6; goto RetN; //return NULL;}
memcpy(&ResPtr[2],&newobj,4);//debug
udtCF->Release();
return (newobj);
RetN:
sprintf((char*)&s,"Err i=%u",i);
MessageBox (NULL,(char*)&s,"",MB_OK);
return NULL;
}
и не работает
Не страшно, если ты один.
Страшно — если ты ноль.