Hi, I don't whant add new code or method to Win32::GUI but make change in my Win32::GUI::AxWindow XS code. You advice about Dynaloader it's very usefull. I can found dll handler with it. It test it with PAR and it's work nice.
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 } } } My code is now : 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 } } } > > For correct this problem, i need to enumerate all dll attached to > > current process and try to found renamed OLE.dll. > > try this command: "set PERL_DL_DEBUG=1" and then launch your exe. this > should give you some hint about the dll that are being loaded. try > "perldoc DynaLoader" for more information on the subject. > > > I found some source code for do this but it's not easy ;o) because don't > > exist a standard API for all Windows system. > > http://www.alexfedotov.com/articles/enumproc.asp > > > > I try to add this in next release. > > no please. Win32::GUI is not the place for this stuff. probably > Win32::Process is the correct place, if it's not implemented already. > > cheers, > Aldo >