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

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


Dynamicly loaded a MFC User DLL

Marc H. Simkin -- simkinm@BankersTrust.com
Thursday, January 25, 1996

I have several MFC Classes that I have written using VC++ 4.0.  I have
placed all these classes in 1 DLL.  I am able to statically link the
DLL with the EXE.  However, I would like to be able to dynamically
link to the DLL using LoadLibrary and GetProcInstance.  Will this work
as expected, or do I need to do it another way?

Thanks

Marc
+---------------------------------------------------------------------+
| Marc H. Simkin                Internet: simkinm@btco.com            |
| Senior Prog/Analyst                     mhsimkin@panix.com          |
| Bankers Trust Company         CIS:      72401,57                    |
| GIS Technology - MS 2191      Work:     (212) 250 7120              |
| 1 Bankers Trust Plaza         Fax:      (212) 250 5675              |
| New York, NY 10006                                                  |
+---------------------------------------------------------------------+



Mike Blaszczak -- mikeblas@interserv.com
Saturday, January 27, 1996

[Mini-digest: 2 responses]

On Thu, 25 Jan 1996, simkinm@BankersTrust.com (Marc H. Simkin) wrote:
>However, I would like to be able to dynamically
>link to the DLL using LoadLibrary and GetProcInstance.  Will this work
>as expected, or do I need to do it another way?

First, you need to make sure you've written an extension DLL.  The 
instructions for the documentation.

You need to do it another way (the way that's documented in Books Online, 
too).  ESsentially, make sure your DllMain() calls AfxTerminateModule() 
appropriately, and use AfxLoadLibrary() and AfxFreeLibrary() instead of the 
similarly named Windows APIs.

.B ekiM
--
TCHAR szDisc[] = _T("These words are my own; I do not speak for Microsoft.");

-----From: "Albert Szilvasy" 

On 25 Jan 96 at 1:54, Marc H. Simkin wrote:

> I have several MFC Classes that I have written using VC++ 4.0.  I have
> placed all these classes in 1 DLL.  I am able to statically link the
> DLL with the EXE.  However, I would like to be able to dynamically
> link to the DLL using LoadLibrary and GetProcInstance.  Will this work
> as expected, or do I need to do it another way?
Yes, it will. I had the same problem, run into difficulties then 
received the following replies for my S.O.S. on this list: (go to the 
end of the letter, that's where I stated my problem.)

[Mini-digest: 3 responses]

I'd bet that your "test function" doesn't switch the module state 
before trying to use MFC, right?

You should have something like this for all exported functions:

void MyTestFunction()
{
     AFX_MANAGE_STATE(AfxGetStaticModuleState());
     CMyDialog dlg;
     dlg.DoModal();
}

Also, exported functions should probably do other things as well -- 
such as catching all exceptions so they don't pass up the chain, and 
perhaps locking/unlocking the maps (AfxLockTempMaps/AfxUnlockTempMaps) 
such that MFC temporary objects are deleted when they are no longer needed.

// Dean

----From: Kalyan Kumar Kona 

Define _AFXDLL in the test program also.

cheers

K.Kalyan Kumar

-----From: "John Elsbree" 

Albert -

You need to make sure you have the correct "module state" in effect while 
functions in your DLL are executing. To learn more about module states, refer 
to these two articles in the VC++ 4.0 documentation:

"Managing the State Data of MFC Modules" in the MFC Encyclopedia
"MFC Module State Implementation" in TechNote 58

mfcTeam.m_johnels;	// does not represent Microsoft

----------
From: 	owner-mfc-l@netcom.com on behalf of Albert Szilvasy
Sent: 	Monday, December 18, 1995 5:12 AM
To: 	mfc-l@netcom.com
Subject: 	LoadLibrary & Regular DLL with shared MFC

Hi,

My problem is what the subject says.
In more detail:
According to the MFC docs now (with 4.0) you can build regular dlls 
(formerly USRDLL) that use  MFC in a dll.
I tried that. I doesn't seem to work with run-time linking.
First, I created a Appwizard DLL using (regular dll using mfc in a shared 
library) I put a test function in it that brings up a dialog.
Second, I created an Appwizard executable (using mfc in a static 
library) I put a test function that loads the library and tries to 
invoke the dll's test function.
The thing won't work. MFC is not properly initialized. The assertion 
that fails:
afxwin1.inl line: 22

I bet I still need to do something. Please tell me what.
Thanks in advance.
Albert
--
UofV,Hungary
--
UofV,Hungary



Tim Hagemann -- 100063.323@compuserve.com
Monday, January 29, 1996

Marc,

>> I have several MFC Classes that I have written using VC++ 4.0.  I have
>> placed all these classes in 1 DLL.  I am able to statically link the
>> DLL with the EXE.  However, I would like to be able to dynamically
>> link to the DLL using LoadLibrary and GetProcInstance.  Will this work
>> as expected, or do I need to do it another way?

Of course, it is possible to use LoadLibrary()/FreeLibrary() and
GetProcAddress() to get a function pointer to all member functions, but because
of the name mangling of the c++ compiler and the hidden this-pointer, this task
is very difficult and defective.

The first solution is to use ole-automation / ole-controls, which support late
binding and 'oop' by design. 
Another solution would be to create a c-export layer and handle all member
function call though this layer. 

Tim Hagemann







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