15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Dynamically loaded extension DLL's

Kevin Gainey -- kevin_g@idesign.com
Thursday, March 28, 1996

Environment: VC 4.1, Win95/WinNT

I have a need to implement dynamically loaded extension DLL's, and I'm 
looking for information on how to do so.

I have searched in the help on-line, looked at the DLLHUSK sample, as 
well as looking in the MFC FAQ.  The best I've found is TN033, which 
mentions using dynamically loaded extension DLL's.

But TN033 doesn't indicate what is different between the implementation 
of a standard extension DLL use, and one that is dynamically loaded.  
Specifically, I wonder how to prevent extension DLL's from being 
automatically loaded.

If anyone could point me to some information where I could learn how to 
implement dynamically loaded extension DLL's, I would appreciate it.

Kevin Gainey
KGAINEY@IDESIGN.COM




Mike Blaszczak -- mikeblas@msn.com
Sunday, March 31, 1996

[Mini-digest: 2 responses]

> Environment: VC 4.1, Win95/WinNT

Thanks.

> I have searched in the help on-line, looked at the DLLHUSK sample, as 
> well as looking in the MFC FAQ.  The best I've found is TN033, which 
> mentions using dynamically loaded extension DLL's.

TN033 contains everything you need.  Updates of the MFC documentation in the 
VC++ online references will actually document the AfxLoadLibrary(), 
AfxFreeLibrary(), and related functions so that you can search on them.

> But TN033 doesn't indicate what is different between the implementation 
> of a standard extension DLL use,

I'm not sure I understand this sentence.  What do you mean by "the 
implementation of [a DLL] use"?

> and one that is dynamically loaded.  
> Specifically, I wonder how to prevent extension DLL's from being 
> automatically loaded.

I'm not sure what you mean by "automatically loaded".  Do you mean that you 
don't want some of the DLLs your application uses to be loaded when your 
application first starts?  If that's the case, you shouldn't link to the 
import library of that DLL.  Instead, you should explicitly call 
AfxLoadLibrary() to get the library into your process and AfxFreeLibrary() 
when you're done with it. Inbetween, you'll need to call GetProcAddress() to 
get a pointer to each function that you want to call.

.B ekiM
TCHAR szIggyPop[] = _T("There's something here they've got to face: it's the 
same for everyone.");


-----From: Geoffrey Nicholls 

>I have searched in the help on-line, looked at the DLLHUSK sample, as 
>well as looking in the MFC FAQ.  The best I've found is TN033, which 
>mentions using dynamically loaded extension DLL's.
>
>But TN033 doesn't indicate what is different between the implementation 
>of a standard extension DLL use, and one that is dynamically loaded.  
>Specifically, I wonder how to prevent extension DLL's from being 
>automatically loaded.

I have this working on WFW 3.11, and expect a little bit of work to get it
to 32 bit windows when the time comes. Still I think this will help. I use
TN033 for the settings to create an MFC extension DLL. Here's the basis of it:

///
// code in the DLL
///

storage AFX_EXTENSION_MODULE g_extensionDLL;
storage HINSTANCE            g_hinstDll;

extern "C" int CALLBACK LibMain(
    HINSTANCE   hInstance,
    WORD        /* wDataSegment */,
    WORD        /* wHeapSize */,
    LPSTR       /* lpszCmdLine */)
{

    // Extension DLL one-time initialization - do not allocate memory here,
    // use the TRACE or ASSERT macros or call MessageBox
    AfxInitExtensionModule(g_extensionDLL, hInstance);

    // remember our instance
    g_hinstDll = hInstance;

    // done
    return(1);

}

void WINAPI _export InitInstance(
    CMultiDocTemplate * &  tplAdd )
{
    
    static BOOL     fLinkLib = FALSE;
    
    // create a new CDynLinkLibrary for this app
    if (!fLinkLib)
    {
        new CDynLinkLibrary(g_extensionDLL);
        fLinkLib = TRUE;
    }

    tplAdd = new CMultiDocTemplate(
        IDR_TEXTTYPE,
        RUNTIME_CLASS(DMyDocument),
        RUNTIME_CLASS(DMyMDIChild),
        RUNTIME_CLASS(DMyView));
        
}

///
// code in the EXE
///

BOOL CWinApp::InitInstance()
{
    ...
    hinstLibrary = LoadLibrary("DYNAMIC.DLL");
    lpfnInit = GetProcAddress(hinstLibrary, "InitInstance");
    (*lpfnInit)(tplDynamic);
    AddDocTemplate(tplDynamic);
    ...
}

Please let me know how this code ports to 32 bit windows.

Good luck,
Geoff Nicholls





| Вернуться в корень Архива |