Re: How to instantiate an [appobject] coclass
On 9 Ott, 20:43, "Igor Tandetnik" <itandet...@mvps.org> wrote:
Most likely, the name of the type library, as given by "library" statement.
Yes, it is! :-P
Read about [appobject] attribute. It basically instructs VB to create an instance of the class automatically, and to make it
available under the library name.
The real question is, why can't VB create an instance of the class. The OP will have to debug that.
I don't know why this happens.
I implemented the IAudioLib interface like any classes and while the
other classes works fine, this one cannot be instantiated!
This is the code:
====================================================================
AudioLib.h
class ATL_NO_VTABLE CAudioLib :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAudioLib, &CLSID_AudioLib>,
public IDispatchImpl<IAudioLib, &IID_IAudioLib, &LIBID_AxAudioLib4, /
*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CAudioLib()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_AUDIOLIB)
BEGIN_COM_MAP(CAudioLib)
COM_INTERFACE_ENTRY(IAudioLib)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHOD (GetLibVersion)(/*[out, retval]*/ BSTR* pVal);
STDMETHOD (RetValToStr)(/*[in]*/ E_AUDIOLIB_RET_VAL rv, /*[out,
retval]*/ BSTR* pVal);
STDMETHOD (GetDeviceCount)(/*[in]*/ E_AUDIO_API audio_api, /*[out,
retval]*/ short* pVal);
STDMETHOD (GetDeviceInfo)(/*[in]*/ long device,
/*[in]*/ E_AUDIO_API audio_api,
/*[in, out]*/ T_DeviceInfo* retDevInfo,
/*[out, retval]*/ E_AUDIOLIB_RET_VAL*
pVal);
STDMETHOD (GetDevicesInfo)(/*[in]*/ E_AUDIO_API audio_api, /*[out,
retval]*/ SAFEARRAY** pVal);
};
OBJECT_ENTRY_AUTO(__uuidof(AudioLib), CAudioLib)
====================================================================
AudioLib.cpp
#include "stdafx.h"
#include "AudioLib.h"
#include "Utility.h"
STDMETHODIMP CAudioLib::GetLibVersion(BSTR* pVal)
{
if (pVal) {
_bstr_t* sv = new _bstr_t(AUDIOLIB_VERSION);
*pVal = sv->Detach();
}
return S_OK;
}
//------------------------------------------------------------------------------
STDMETHODIMP CAudioLib::RetValToStr(E_AUDIOLIB_RET_VAL rv, BSTR* pVal)
{
if (pVal) {
_bstr_t* sv = new _bstr_t( EuroAudioLib::RetValToStr
(static_cast<EuroAudioLib::EAudioLibRetVal>(rv)) );
*pVal = sv->Detach();
}
return S_OK;
}
//------------------------------------------------------------------------------
STDMETHODIMP CAudioLib::GetDeviceCount(E_AUDIO_API audio_api, short*
pVal)
{
if (pVal)
*pVal = EuroAudioLib::GetDeviceCount(static_cast<RtAudio::Api>
(audio_api));
return S_OK;
}
//------------------------------------------------------------------------------
STDMETHODIMP CAudioLib::GetDeviceInfo(long device,
E_AUDIO_API audio_api,
T_DeviceInfo* retDevInfo,
E_AUDIOLIB_RET_VAL* pVal)
{
if (retDevInfo)
{
RtAudio::DeviceInfo info;
long retval = EuroAudioLib::GetDeviceInfo(device,
static_cast<RtAudio::Api>
(audio_api),
&info);
// Convert from RtAudio::DeviceInfo to T_DeviceInfo
ConvertFromDeviceInfo(retDevInfo, &info);
if (pVal) *pVal = static_cast<E_AUDIOLIB_RET_VAL>(retval);
}
return S_OK;
}
//------------------------------------------------------------------------------
STDMETHODIMP CAudioLib::GetDevicesInfo(E_AUDIO_API audio_api,
SAFEARRAY** pVal)
{
SAFEARRAYBOUND sab;
IRecordInfo* pRecordInfo = NULL;
T_DeviceInfo* pinfo;
EuroAudioLib::DeviceInfoList info_list;
EuroAudioLib::DeviceInfoList::iterator info_it;
//Retreive the list of informations
EuroAudioLib::GetDevicesInfo(static_cast<RtAudio::Api>(audio_api),
&info_list);
sab.lLbound = 0;
sab.cElements = info_list.size();
// Filled an information structure in order to create the table
HRESULT hr = GetRecordInfoFromGuids(LIBID_AxAudioLib4,
1, // uVerMajor
0, // uVerMinor
GetUserDefaultLCID(),
IID_IAudioLib,
&pRecordInfo);
// Destroys the table if it already existed
if (*pVal != NULL)
{
SafeArrayDestroy(*pVal);
*pVal = NULL;
}
// Create an array for transport
*pVal = SafeArrayCreateEx(VT_RECORD, 1, &sab, pRecordInfo);
pRecordInfo->Release();
if (*pVal == NULL)
{
hr = Error(_T("Cannot create the devices info array"));
return hr;
}
hr = SafeArrayAccessData(*pVal, (void**)&pinfo);
if (FAILED(hr))
return hr;
// fill in UDT members
uint16_t i = 0;
for(info_it = info_list.begin(); info_it != info_list.end(); info_it+
+)
ConvertFromDeviceInfo(&pinfo[i++], &(*info_it));
hr = SafeArrayUnaccessData(*pVal);
if (FAILED(hr))
{
SafeArrayDestroy(*pVal);
return hr;
}
return S_OK;
}