День добрый!
Есть приложение(Сервер) на C++ в котором описаны классы
Код | class INamer : public IUnknown { public: STDMETHOD( GetSharedMemoryName( BSTR )) PURE; };
class Namer : public INamer { protected: // Reference count long m_lRef; BSTR wsSharedMemoryName;
public: Namer(); ~Namer();
public: // IUnknown STDMETHOD(QueryInterface( REFIID, void** )); STDMETHOD_(ULONG, AddRef()); STDMETHOD_(ULONG, Release());
// INamer STDMETHOD( GetSharedMemoryName( BSTR )); };
class NamerClassFactory : public IClassFactory { protected: long m_lRef;
public: NamerClassFactory(); ~NamerClassFactory();
// IUnknown STDMETHOD( QueryInterface(REFIID, void** )); STDMETHOD_(ULONG, AddRef()); STDMETHOD_(ULONG, Release());
// IClassFactory STDMETHOD( CreateInstance(LPUNKNOWN, REFIID, void**)); STDMETHOD( LockServer(BOOL)); };
|
Метод GetSharedMemoryName принимает BSTR (wchar_t*), куда потом копирует wsSharedMemoryName:
Код | Namer::Namer() { m_lRef = 0;
// Increment the global object count InterlockedIncrement( &g_lObjs );
wsSharedMemoryName = (BSTR)CoTaskMemAlloc(sizeof(OLECHAR)*128); memset(wsSharedMemoryName, 0, sizeof(OLECHAR)*128); for(int i = 0; i < 127; ++i) { wsSharedMemoryName[i] = (OLECHAR) ((rand() % 26) + 65); } }
STDMETHODIMP Namer::GetSharedMemoryName( BSTR chResult ) { memcpy(chResult,wsSharedMemoryName,sizeof(OLECHAR)*128); //здесь брейкпоинт return S_OK; }
|
Запускаю приложение(клиент)
Код | int main( int argc, char *argv[] ) { CoInitialize( NULL ); IClassFactory *pCF; BSTR str = (BSTR)CoTaskMemAlloc(128*sizeof(OLECHAR)); IUnknown* pUnknown; INamer* pNamer;
HRESULT hr = CoGetClassObject( CLSID_Namer, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory, (void**) &pCF); hr = pCF->CreateInstance(NULL,IID_IUnknown, (void**)&pUnknown); pCF->Release(); hr = pUnknown->QueryInterface(IID_INamer, (void**)&pNamer); pUnknown->Release(); hr = pNamer->GetSharedMemoryName(str); // E_OUTOFMEMORY pNamer->Release ();
CoUninitialize(); return 0; }
|
И вызов pNamer->GetSharedMemoryName(str) возвращает ошибку E_OUTOFMEMORY и str никак не меняется( естественно ). Хотя если поставить брейкпоинт в сервере на memcpy, то видно, что том всё выполняется и копируется наура! Уверен, что есть какая-то мелочь, но какая |