bool AutoProcessor::process(const char *in_str, string &out_str) { if (!bInit) return false; CComBSTR str(in_str); CComVariant vArg(str); CComVariant vRes; HRESULT hResult = disp.Invoke1(L"Process", &vArg, &vRes); if (FAILED(hResult)) return false; CComBSTR out(vRes.bstrVal); if (out.Length()){ size_t size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), 0, 0, NULL, NULL); char *res = new char[size + 1]; size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), res, size, NULL, NULL); res[size] = 0; out_str = res; delete[] res; }else{ return false; } return true; }
///////////////////////////////////////////////////////////////////////////// // CMaxMaterialCollection STDMETHODIMP CMaxMaterialCollection::FinalConstruct() { HRESULT hr = E_FAIL, hr2 = E_FAIL; //simply make a reference to the scene material collection MtlBaseLib* pMtlLib = GetCOREInterface()->GetSceneMtls(); mLastSceneMtlLibSize = 0; #ifdef PERSIST_SCRATCH mpScratchMtlLib = NULL; #endif assert(pMtlLib); //RK: 10/21/04 -- this forces ACT toolkit to initialize at startup and avoids delays during material assignment. CComDispatchDriver act; /* FIXME: Use the .NET wrappers directly instead of this; act.CoCreateInstance( L"Autodesk.Act.Core.ContentSerializer" ); For some reason, the prog ID above is not being registered with the version we now install with Max 9, and I've had to resort to using the CLSID directly. Either we have the wrong version, or the new DLL just doesn't register its prog ID. (more likely it's the former) */ CLSID clsidCore; hr = CLSIDFromString(L"{978C551B-5919-42F7-81AB-690D66AB7B78}", &clsidCore); if( SUCCEEDED(hr) ) hr = act.CoCreateInstance( clsidCore ); if (SUCCEEDED(hr)) { CComVariant xml(L"<Material><StandardMtl name=\"Test\" /></Material>"); CComPtr<IUnknown> mtl; hr2 = mtl.CoCreateInstance( L"Autodesk.Act.Content.Material"); hr2 = act.Invoke1( L"DeserializeString", &xml ); } if ( FAILED(hr) || FAILED(hr2) ) { if (GetCOREInterface()->GetQuietMode()) GetCOREInterface()->Log()->LogEntry(SYSLOG_ERROR,NO_DIALOG, TSTR(GetString(IDS_PROJNAME)), TSTR(GetString(IDS_ACT_REGISTRATION_FAILED))); else MaxMsgBox( GetCOREInterface()->GetMAXHWnd(), TSTR(GetString(IDS_ACT_REGISTRATION_FAILED)), TSTR(GetString(IDS_PROJNAME)), MB_OK ); } assert(SUCCEEDED(hr) && SUCCEEDED(hr2)); //RK: This forces XMlmtl to initialize at startup. CComPtr<IVIZPointerClient> pPointerClient; hr = GetXMLImpExp(&pPointerClient); assert(SUCCEEDED(hr)); #ifdef RECYCLE_MATS #endif RegisterNotification(NotifyProc, this, NOTIFY_FILE_PRE_OPEN); RegisterNotification(NotifyProc, this, NOTIFY_FILE_POST_OPEN); RegisterNotification(NotifyProc, this, NOTIFY_FILE_OPEN_FAILED); RegisterNotification(NotifyProc, this, NOTIFY_FILE_PRE_MERGE); RegisterNotification(NotifyProc, this, NOTIFY_FILE_POST_MERGE); RegisterNotification(NotifyProc, this, NOTIFY_FILE_PRE_SAVE); RegisterNotification(NotifyProc, this, NOTIFY_FILE_POST_SAVE); RegisterNotification(NotifyProc, this, NOTIFY_PRE_IMPORT); RegisterNotification(NotifyProc, this, NOTIFY_POST_IMPORT); RegisterNotification(NotifyProc, this, NOTIFY_SYSTEM_PRE_NEW); RegisterNotification(NotifyProc, this, NOTIFY_SYSTEM_POST_NEW); RegisterNotification(NotifyProc, this, NOTIFY_SYSTEM_PRE_RESET); RegisterNotification(NotifyProc, this, NOTIFY_SYSTEM_POST_RESET); RegisterNotification(NotifyProc, this, NOTIFY_SCENE_UNDO); RegisterNotification(NotifyProc, this, NOTIFY_SCENE_REDO); #ifdef SUSPEND_UNDO RegisterNotification(NotifyProc, this, NOTIFY_SCENE_PRE_UNDO); RegisterNotification(NotifyProc, this, NOTIFY_SCENE_PRE_REDO); #endif RegisterNotification(NotifyProc, (void *)this, NOTIFY_MEDIT_SHOW); #ifdef TP_SUSPEND_FOR_FILELINK RegisterNotification(NotifyProc, this, NOTIFY_FILELINK_PRE_BIND ); RegisterNotification(NotifyProc, this, NOTIFY_FILELINK_POST_BIND ); RegisterNotification(NotifyProc, this, NOTIFY_FILELINK_PRE_DETACH ); RegisterNotification(NotifyProc, this, NOTIFY_FILELINK_POST_DETACH ); RegisterNotification(NotifyProc, this, NOTIFY_FILELINK_PRE_RELOAD ); RegisterNotification(NotifyProc, this, NOTIFY_FILELINK_POST_RELOAD ); RegisterNotification(NotifyProc, this, NOTIFY_FILELINK_PRE_ATTACH ); RegisterNotification(NotifyProc, this, NOTIFY_FILELINK_POST_ATTACH ); #endif //and finally a mechanism for other parts of the system to actively suspend TP RegisterNotification(NotifyProc, this, NOTIFY_TOOLPALETTE_MTL_SUSPEND ); RegisterNotification(NotifyProc, this, NOTIFY_TOOLPALETTE_MTL_RESUME ); //for DID 642266, pre and post cloning RegisterNotification(NotifyProc, this, NOTIFY_PRE_NODES_CLONED ); RegisterNotification(NotifyProc, this, NOTIFY_POST_NODES_CLONED ); RefResult res = ReplaceReference(SCENE_MTLLIB_REFNUM, (RefTargetHandle) pMtlLib); #ifdef PERSIST_SCRATCH res = ReplaceReference(SCRATCH_MTLLIB_REFNUM, (RefTargetHandle) &theScratchMtlLib); #endif Resume(); if(res == REF_SUCCEED) hr = S_OK; return hr; }