@@ -3772,22 +3772,20 @@ void IUInvokeDispMethod(
37723772
37733773#if defined(FEATURE_COMINTEROP_UNMANAGED_ACTIVATION) && defined(FEATURE_COMINTEROP)
37743774
3775- void GetComClassHelper (
3775+ static void GetComClassHelper (
37763776 _Out_ OBJECTREF *pRef,
37773777 _In_ EEClassFactoryInfoHashTable *pClassFactHash,
3778- _In_ ClassFactoryInfo *pClassFactInfo,
3779- _In_opt_ WCHAR *wszProgID)
3778+ _In_ ClassFactoryInfo *pClassFactInfo)
37803779{
37813780 CONTRACTL
37823781 {
37833782 THROWS;
37843783 GC_TRIGGERS;
3785- MODE_ANY ;
3784+ MODE_COOPERATIVE ;
37863785 INJECT_FAULT (ThrowOutOfMemory ());
37873786 PRECONDITION (CheckPointer (pRef));
37883787 PRECONDITION (CheckPointer (pClassFactHash));
37893788 PRECONDITION (CheckPointer (pClassFactInfo));
3790- PRECONDITION (CheckPointer (wszProgID, NULL_OK));
37913789 }
37923790 CONTRACTL_END;
37933791
@@ -3809,17 +3807,9 @@ void GetComClassHelper(
38093807 // represent it.
38103808 //
38113809
3812- NewHolder<ComClassFactory> pComClsFac = ComClassFactoryCreator::Create (pClassFactInfo->m_clsid );
3810+ NewHolder<ComClassFactory> pComClsFac = new ComClassFactory (pClassFactInfo->m_clsid );
38133811 pComClsFac->SetManagedVersion ();
38143812
3815- NewArrayHolder<WCHAR> wszRefProgID = NULL ;
3816- if (wszProgID)
3817- {
3818- size_t len = wcslen (wszProgID)+1 ;
3819- wszRefProgID = new WCHAR[len];
3820- wcscpy_s (wszRefProgID, len, wszProgID);
3821- }
3822-
38233813 NewArrayHolder<WCHAR> wszRefServer = NULL ;
38243814 if (pClassFactInfo->m_strServerName )
38253815 {
@@ -3828,7 +3818,7 @@ void GetComClassHelper(
38283818 wcscpy_s (wszRefServer, len, pClassFactInfo->m_strServerName );
38293819 }
38303820
3831- pComClsFac->Init (wszRefProgID, wszRefServer, NULL );
3821+ pComClsFac->Init (wszRefServer, NULL );
38323822 AllocateComClassObject (pComClsFac, pRef);
38333823
38343824 // Insert to hash.
@@ -3838,130 +3828,25 @@ void GetComClassHelper(
38383828 // Make sure the hash code is working.
38393829 _ASSERTE (pClassFactHash->GetValue (pClassFactInfo, (HashDatum *)&hRef));
38403830
3841- wszRefProgID.SuppressRelease ();
38423831 wszRefServer.SuppressRelease ();
38433832 pComClsFac.SuppressRelease ();
38443833 }
38453834}
38463835
38473836// -------------------------------------------------------------
38483837// returns a ComClass reflect class that wraps the IClassFactory
3849- void GetComClassFromProgID (STRINGREF srefProgID, STRINGREF srefServer , OBJECTREF *pRef)
3838+ void GetComClassFromCLSID (REFCLSID clsid, _In_opt_z_ PCWSTR wszServer , OBJECTREF *pRef)
38503839{
38513840 CONTRACTL
38523841 {
38533842 THROWS;
38543843 GC_TRIGGERS;
38553844 MODE_COOPERATIVE;
38563845 INJECT_FAULT (COMPlusThrowOM ());
3857- PRECONDITION (srefProgID != NULL );
38583846 PRECONDITION (pRef != NULL );
38593847 }
38603848 CONTRACTL_END;
38613849
3862- NewArrayHolder<WCHAR> wszProgID;
3863- NewArrayHolder<WCHAR> wszServer;
3864- HRESULT hr = S_OK;
3865- MethodTable* pMT = NULL ;
3866- CLSID clsid = {0 };
3867-
3868- //
3869- // Allocate strings for the ProgID and the server.
3870- //
3871-
3872- int len = srefProgID->GetStringLength ();
3873-
3874- wszProgID = new WCHAR[len+1 ];
3875-
3876- if (len)
3877- memcpy (wszProgID, srefProgID->GetBuffer (), (len*2 ));
3878- wszProgID[len] = W (' \0 ' );
3879-
3880- if (srefServer != NULL )
3881- {
3882- len = srefServer->GetStringLength ();
3883-
3884- wszServer = new WCHAR[len+1 ];
3885-
3886- if (len)
3887- memcpy (wszServer, srefServer->GetBuffer (), (len*2 ));
3888- wszServer[len] = W (' \0 ' );
3889- }
3890-
3891-
3892- //
3893- // Call GetCLSIDFromProgID() to convert the ProgID to a CLSID.
3894- //
3895-
3896- EnsureComStarted ();
3897-
3898- {
3899- GCX_PREEMP ();
3900- hr = GetCLSIDFromProgID (wszProgID, &clsid);
3901- }
3902-
3903- if (FAILED (hr))
3904- COMPlusThrowHR (hr);
3905-
3906- //
3907- // See if we can find the well known managed class for this CLSID.
3908- //
3909-
3910- // Check if we have in the hash.
3911- OBJECTHANDLE hRef;
3912- ClassFactoryInfo ClassFactInfo;
3913- ClassFactInfo.m_clsid = clsid;
3914- ClassFactInfo.m_strServerName = wszServer;
3915- EEClassFactoryInfoHashTable *pClassFactHash = GetAppDomain ()->GetClassFactHash ();
3916-
3917- if (pClassFactHash->GetValue (&ClassFactInfo, (HashDatum *)&hRef))
3918- {
3919- *pRef = ObjectFromHandle (hRef);
3920- }
3921- else
3922- {
3923- GetComClassHelper (pRef, pClassFactHash, &ClassFactInfo, wszProgID);
3924- }
3925-
3926- // If we made it this far *pRef better be set.
3927- _ASSERTE (*pRef != NULL );
3928- }
3929-
3930- // -------------------------------------------------------------
3931- // returns a ComClass reflect class that wraps the IClassFactory
3932- void GetComClassFromCLSID (REFCLSID clsid, STRINGREF srefServer, OBJECTREF *pRef)
3933- {
3934- CONTRACTL
3935- {
3936- THROWS;
3937- GC_TRIGGERS;
3938- MODE_COOPERATIVE;
3939- INJECT_FAULT (COMPlusThrowOM ());
3940- PRECONDITION (pRef != NULL );
3941- }
3942- CONTRACTL_END;
3943-
3944- NewArrayHolder<WCHAR> wszServer;
3945- HRESULT hr = S_OK;
3946- MethodTable* pMT = NULL ;
3947-
3948- //
3949- // Allocate strings for the server.
3950- //
3951-
3952- if (srefServer != NULL )
3953- {
3954- int len = srefServer->GetStringLength ();
3955-
3956- wszServer = new WCHAR[len+1 ];
3957-
3958- if (len)
3959- memcpy (wszServer, srefServer->GetBuffer (), (len*2 ));
3960-
3961- wszServer[len] = W (' \0 ' );
3962- }
3963-
3964-
39653850 //
39663851 // See if we can find the well known managed class for this CLSID.
39673852 //
@@ -3979,7 +3864,7 @@ void GetComClassFromCLSID(REFCLSID clsid, STRINGREF srefServer, OBJECTREF *pRef)
39793864 }
39803865 else
39813866 {
3982- GetComClassHelper (pRef, pClassFactHash, &ClassFactInfo, NULL );
3867+ GetComClassHelper (pRef, pClassFactHash, &ClassFactInfo);
39833868 }
39843869
39853870 // If we made it this far *pRef better be set.
@@ -4027,11 +3912,11 @@ ClassFactoryBase *GetComClassFactory(MethodTable* pClassMT)
40273912 GUID guid;
40283913 pClassMT->GetGuid (&guid, TRUE );
40293914
4030- ComClassFactory *pComClsFac = ComClassFactoryCreator::Create (guid);
3915+ ComClassFactory *pComClsFac = new ComClassFactory (guid);
40313916
40323917 pNewFactory = pComClsFac;
40333918
4034- pComClsFac->Init (NULL , NULL , pClassMT);
3919+ pComClsFac->Init (NULL , pClassMT);
40353920
40363921 // store the class factory in EE Class
40373922 if (!pClassMT->SetComClassFactory (pNewFactory))
0 commit comments