Создание объекта COM в рантайме БЕЗ регистрации *.dll
От: NewEmptyName  
Дата: 21.11.07 08:18
Оценка:
Добрый день всем!
Собственно, сабж. Есть ДЛЛ или ОСХ, нужно создать объек без регистрации библиотеки.
Рабочий пример как это сделать исключительно на ВБ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;
}


и не работает
Не страшно, если ты один.
Страшно — если ты ноль.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.