Создание экземпляра отчета через Com
Пытаюсь использовать fastreports3.dll в portable приложении. По этой причине FastReport не зарегистрирован в системе.
Тем не менее, зная clsid, можно получать желаемые интерфейсы и использовать функционал FastReport. Но при создании экземпляра какого-либо объекта fastreports3.dll просто падает. Всё это смахивает на баг в FastReport.
Привожу пример кода:
HRESULT hr;
IClassFactory * pFactory = NULL;
IUnknown * pUnk = NULL;
IfrxReportPtr pReport = NULL;
CLSID ClsIdReport = __uuidof(TfrxReport);
if( !(m_hLib = ::LoadLibrary("fastreport3.dll")))
return false;
if(!(pfDllGetClassObject = (DllGetClassObjectProc)::GetProcAddress(m_hLib, "DllGetClassObject")))
return false;
//Указатель на фабрику мне выдают без проблем:
if(FAILED(hr = pfDllGetClassObject(ClsIdReport, IID_IClassFactory, (LPVOID*)&pFactory)) || pFactory == NULL)
return false;
//Дальше фабрика не хочет создавать никакого объекта и выдает сообщение про чтение по неверному адресу:
if(FAILED(hr = pFactory->CreateInstance(NULL, IID_IUnknown, (LPVOID*)&pUnk)) || pUnk == NULL)
return false;
if(FAILED(hr = pFactory->CreateInstance(NULL, IIdReport, (LPVOID*)&pReport)) || pReport == NULL)
return false;
Если же инсталлирую FastReport, то все работает. Использую пока что триальную версию fastreports3.dll.
Хотелось бы выяснить:
а) я что-то не так делаю
б) это баг fastreports3.dll
в) это фича, связанная с триальностью версии библиотеки. Но тогда у меня должна быть гарантия, что данный эффект не проявится на купленной FastReport
Спасибо за внимание.
Тем не менее, зная clsid, можно получать желаемые интерфейсы и использовать функционал FastReport. Но при создании экземпляра какого-либо объекта fastreports3.dll просто падает. Всё это смахивает на баг в FastReport.
Привожу пример кода:
HRESULT hr;
IClassFactory * pFactory = NULL;
IUnknown * pUnk = NULL;
IfrxReportPtr pReport = NULL;
CLSID ClsIdReport = __uuidof(TfrxReport);
if( !(m_hLib = ::LoadLibrary("fastreport3.dll")))
return false;
if(!(pfDllGetClassObject = (DllGetClassObjectProc)::GetProcAddress(m_hLib, "DllGetClassObject")))
return false;
//Указатель на фабрику мне выдают без проблем:
if(FAILED(hr = pfDllGetClassObject(ClsIdReport, IID_IClassFactory, (LPVOID*)&pFactory)) || pFactory == NULL)
return false;
//Дальше фабрика не хочет создавать никакого объекта и выдает сообщение про чтение по неверному адресу:
if(FAILED(hr = pFactory->CreateInstance(NULL, IID_IUnknown, (LPVOID*)&pUnk)) || pUnk == NULL)
return false;
if(FAILED(hr = pFactory->CreateInstance(NULL, IIdReport, (LPVOID*)&pReport)) || pReport == NULL)
return false;
Если же инсталлирую FastReport, то все работает. Использую пока что триальную версию fastreports3.dll.
Хотелось бы выяснить:
а) я что-то не так делаю
б) это баг fastreports3.dll
в) это фича, связанная с триальностью версии библиотеки. Но тогда у меня должна быть гарантия, что данный эффект не проявится на купленной FastReport
Спасибо за внимание.
Комментарии
звезда Меган Фокс