void GetOLE (container) CContainer* container CODE: { #ifdef PERL_5005 typedef SV* (*MYPROC)(CPERLarg_ HV *, IDispatch *, SV *); #else typedef SV* (*MYPROC)(pTHX_ HV *, IDispatch *, SV *); #endif HMODULE hmodule; MYPROC pCreatePerlObject; IDispatch * pDispatch; ST(0) = &PL_sv_undef; // Try to find OLE.dll hmodule = GetModuleHandle("OLE"); if (hmodule == 0) { // Try to find using Dynaloader AV* av_modules = get_av("DynaLoader::dl_modules", FALSE); AV* av_librefs = get_av("DynaLoader::dl_librefs", FALSE); if (av_modules && av_librefs) { // Look at Win32::OLE package for (I32 i = 0; i < av_len(av_modules); i++) { SV** sv = av_fetch(av_modules, i, 0); if (sv && SvPOK (*sv) && strEQ(SvPV_nolen(*sv), "Win32::OLE")) { // Tahe sv = av_fetch(av_librefs, i, 0); hmodule = (HMODULE) (sv && SvIOK (*sv) ? SvIV(*sv) : 0); break; } } } } if (hmodule != 0) { pCreatePerlObject = (MYPROC) GetProcAddress(hmodule, "CreatePerlObject"); if (pCreatePerlObject != 0) { HV *stash = gv_stashpv("Win32::OLE", TRUE); pDispatch = container->GetIDispatch(); pDispatch->AddRef(); #ifdef PERL_5005 ST(0) = (pCreatePerlObject)(PERL_OBJECT_THIS_ stash, pDispatch, NULL); #else ST(0) = (pCreatePerlObject)(aTHX_ stash, pDispatch, NULL); #endif } } }