@@ -53,26 +53,21 @@ pub fn factory<C: crate::RuntimeName, I: Interface>() -> crate::Result<I> {
53
53
let mut factory: Option < I > = None ;
54
54
let name = crate :: HSTRING :: from ( C :: NAME ) ;
55
55
56
- let code = if let Some ( function) = unsafe { delay_load :: < RoGetActivationFactory > ( crate :: s!( "combase.dll" ) , crate :: s!( "RoGetActivationFactory" ) ) } {
57
- unsafe {
58
- let mut code = function ( std:: mem:: transmute_copy ( & name) , & I :: IID , & mut factory as * mut _ as * mut _ ) ;
59
-
60
- // If RoGetActivationFactory fails because combase hasn't been loaded yet then load combase
61
- // automatically so that it "just works" for apartment-agnostic code.
62
- if code == CO_E_NOTINITIALIZED {
63
- if let Some ( mta) = delay_load :: < CoIncrementMTAUsage > ( crate :: s!( "ole32.dll" ) , crate :: s!( "CoIncrementMTAUsage" ) ) {
64
- let mut cookie = std:: ptr:: null_mut ( ) ;
65
- let _ = mta ( & mut cookie) ;
66
- }
67
-
68
- // Now try a second time to get the activation factory via the OS.
69
- code = function ( std:: mem:: transmute_copy ( & name) , & I :: IID , & mut factory as * mut _ as * mut _ ) ;
70
- }
71
-
72
- code
56
+ let code = unsafe {
57
+ let mut get_com_factory = || crate :: HRESULT ( RoGetActivationFactory ( std:: mem:: transmute_copy ( & name) , & I :: IID as * const _ as _ , & mut factory as * mut _ as * mut _ ) ) ;
58
+ let mut code = get_com_factory ( ) ;
59
+
60
+ // If RoGetActivationFactory fails because combase hasn't been loaded yet then load combase
61
+ // automatically so that it "just works" for apartment-agnostic code.
62
+ if code == CO_E_NOTINITIALIZED {
63
+ let mut cookie = 0 ;
64
+ CoIncrementMTAUsage ( & mut cookie) ;
65
+
66
+ // Now try a second time to get the activation factory via the OS.
67
+ code = get_com_factory ( ) ;
73
68
}
74
- } else {
75
- CLASS_E_CLASSNOTAVAILABLE
69
+
70
+ code
76
71
} ;
77
72
78
73
// If this succeeded then return the resulting factory interface.
@@ -124,8 +119,6 @@ unsafe fn get_activation_factory(library: crate::PCSTR, name: &crate::HSTRING) -
124
119
function ( std:: mem:: transmute_copy ( name) , & mut abi) . from_abi ( abi)
125
120
}
126
121
127
- type CoIncrementMTAUsage = extern "system" fn ( cookie : * mut * mut std:: ffi:: c_void ) -> crate :: HRESULT ;
128
- type RoGetActivationFactory = extern "system" fn ( hstring : * mut std:: ffi:: c_void , interface : & crate :: GUID , result : * mut * mut std:: ffi:: c_void ) -> crate :: HRESULT ;
129
122
type DllGetActivationFactory = extern "system" fn ( name : * mut std:: ffi:: c_void , factory : * mut * mut std:: ffi:: c_void ) -> crate :: HRESULT ;
130
123
131
124
#[ cfg( test) ]
0 commit comments