DLL-Hell: delay-load dependency problems only the second time

I have a problem with strange symptoms. My application loads my DLL the 
following way:


typedef bool (*FooPtr) (void);

{
HINSTANCE hInstDll = AfxLoadLibrary(lpszModuleName);

if (!hInstDll) return;		//  fails the second time we come here

FooPtr pFoo = (FooPtr) GetProcAddress(hInstDll, "Foo");

bool bRetVal = (pFoo)();

AfxFreeLibrary(hInstDll);
}


It works fine on many computers, it works the first time executed on 
every machine tested.

On some machines, executing this code after a short time again, it 
fails. I have observed it on both Win2k and WinXP.

Using DependencyWalker on these machines, I get the following:

Warning: At least one module has an unresolved import due to a missing 
export function in a delay-load dependent module.

Problematic DLLs:

KERNEL32.DLL
MPR.DLL
NTDLL.DLL

Using DependencyWalker on my machine, I get no warnings whatsoever.

The calling app was build with VC6, the DLL with VC7.

Any help is greatly appreciated!

Regards Christoph
0
Christoph
12/14/2005 4:56:28 PM
vc.mfc 33608 articles. 0 followers. Follow

2 Replies
836 Views

Similar Articles

[PageSpeed] 23

See below...
On Wed, 14 Dec 2005 17:56:28 +0100, Christoph Petschnig <cp05@123cad.de> wrote:

>I have a problem with strange symptoms. My application loads my DLL the 
>following way:
>
>
>typedef bool (*FooPtr) (void);
>
>{
>HINSTANCE hInstDll = AfxLoadLibrary(lpszModuleName);
>
>if (!hInstDll) return;		//  fails the second time we come here
****
The correct approach is
if(hInstDll == NULL)
    { /* failed */
     DWORD err = ::GetLastError();
     ... format and display the error code
     return;
   } /* failed */

Unless you can tell the exact error that is returned, you have done nothing more than say
"My program has a bug somewhere".

It is usually a very bad idea to put a return on the same line as an if-test.  This makes
it really hard to debug the code.  What you want to do is put a breakpoint on the return
statement, which is the *next* line, so you stop in the debugger only if there is an
error.  You could then, even if you didn't use the lines I show above, you could go to the
watch window and do @ERR,hr (or in VS.NET, ERR,hr) to get the error code.  This would
result in an informative question being asked.
****
>
>FooPtr pFoo = (FooPtr) GetProcAddress(hInstDll, "Foo");
>
>bool bRetVal = (pFoo)();
****
Note that sometimes it is a lot clearer to write

FooPtr Foo = (FooPtr)GetProcAddress(...);
bool bRetVal = Foo();

That is, there is rarely a need to invent names that differ from the function name, or use
parentheses.  
****
>
>AfxFreeLibrary(hInstDll);
>}
>
>
>It works fine on many computers, it works the first time executed on 
>every machine tested.
>
>On some machines, executing this code after a short time again, it 
>fails. I have observed it on both Win2k and WinXP.
>
>Using DependencyWalker on these machines, I get the following:
>
>Warning: At least one module has an unresolved import due to a missing 
>export function in a delay-load dependent module.
>
>Problematic DLLs:
>
>KERNEL32.DLL
>MPR.DLL
>NTDLL.DLL
>
>Using DependencyWalker on my machine, I get no warnings whatsoever.
****
The most likely cause is that you are calling a Win32 function which is not defined on
earlier machines.  This could include APIs that are defined only in a particular service
pack.  So if your DLL called a function that was not defined in an earlier version of the
OS, the DLL would fail to load.

One way to handle this, if you determine what function it is, is to do

HMODULE mod = ::LoadModuleHandle(_T("whatever.dll")); 

where "whatever" might be KERNEL32, GDI32, or any other module that contains the
unresolved API reference, then do

WhateverAPIProc Whatever = ::GetProcAddress(mod, "Whatever");

and see if that value is NULL.  If it is, then you are running on an OS that doesn't
support that API call.  If it isn't in your DLL, then some DLL that is being loaded by
your DLL is the guilty party, and youv'e got a more serious problem.

Note that your response to finding a NULL function pointer may be to issue a MessageBox
saying that some functionality is not available, or to implement a workaround using some
older or less-graceful set of API calls to simulate the desired behavior, or return an
error code to the caller to indicate that the operation can't be done. 

Note that if you build the DLL with VC7, you've got several issues.  It could be using the
newer CRT, or use an API defined in the latest platform SDK that may or may not be
available in the actual target OS.  Also note that if the DLL Is using MFC, you've got
additional confusion because you are involving two different CRT or MFC runtimes, which
might lead to other problems that lead to the failure mode.  Mixing and matching like this
has certain risks.
			joe
****
>
>The calling app was build with VC6, the DLL with VC7.
>
>Any help is greatly appreciated!
>
>Regards Christoph
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm
0
newcomer (15975)
12/16/2005 5:09:47 PM
Hello Joseph,

thank you for your response.

I shortened the code to post only the essential stuff. ::GetLastError() 
tells me there is a delay load problem, but this occurs only the second 
time within one application execution. When I restart the application, I 
can again run the code (but only one time) successfully.

However, I solved the problem by calling 
AfxLoadLibrary()/AfxFreeLibrary() only once within an application runtime.

Regards Christoph


Joseph M. Newcomer wrote:
> See below...
> On Wed, 14 Dec 2005 17:56:28 +0100, Christoph Petschnig <cp05@123cad.de> wrote:
> 
> 
>>I have a problem with strange symptoms. My application loads my DLL the 
>>following way:
>>
>>
>>typedef bool (*FooPtr) (void);
>>
>>{
>>HINSTANCE hInstDll = AfxLoadLibrary(lpszModuleName);
>>
>>if (!hInstDll) return;		//  fails the second time we come here
> 
> ****
> The correct approach is
> if(hInstDll == NULL)
>     { /* failed */
>      DWORD err = ::GetLastError();
>      ... format and display the error code
>      return;
>    } /* failed */
> 
> Unless you can tell the exact error that is returned, you have done nothing more than say
> "My program has a bug somewhere".
> 
> It is usually a very bad idea to put a return on the same line as an if-test.  This makes
> it really hard to debug the code.  What you want to do is put a breakpoint on the return
> statement, which is the *next* line, so you stop in the debugger only if there is an
> error.  You could then, even if you didn't use the lines I show above, you could go to the
> watch window and do @ERR,hr (or in VS.NET, ERR,hr) to get the error code.  This would
> result in an informative question being asked.
> ****
> 
>>FooPtr pFoo = (FooPtr) GetProcAddress(hInstDll, "Foo");
>>
>>bool bRetVal = (pFoo)();
> 
> ****
> Note that sometimes it is a lot clearer to write
> 
> FooPtr Foo = (FooPtr)GetProcAddress(...);
> bool bRetVal = Foo();
> 
> That is, there is rarely a need to invent names that differ from the function name, or use
> parentheses.  
> ****
> 
>>AfxFreeLibrary(hInstDll);
>>}
>>
>>
>>It works fine on many computers, it works the first time executed on 
>>every machine tested.
>>
>>On some machines, executing this code after a short time again, it 
>>fails. I have observed it on both Win2k and WinXP.
>>
>>Using DependencyWalker on these machines, I get the following:
>>
>>Warning: At least one module has an unresolved import due to a missing 
>>export function in a delay-load dependent module.
>>
>>Problematic DLLs:
>>
>>KERNEL32.DLL
>>MPR.DLL
>>NTDLL.DLL
>>
>>Using DependencyWalker on my machine, I get no warnings whatsoever.
> 
> ****
> The most likely cause is that you are calling a Win32 function which is not defined on
> earlier machines.  This could include APIs that are defined only in a particular service
> pack.  So if your DLL called a function that was not defined in an earlier version of the
> OS, the DLL would fail to load.
> 
> One way to handle this, if you determine what function it is, is to do
> 
> HMODULE mod = ::LoadModuleHandle(_T("whatever.dll")); 
> 
> where "whatever" might be KERNEL32, GDI32, or any other module that contains the
> unresolved API reference, then do
> 
> WhateverAPIProc Whatever = ::GetProcAddress(mod, "Whatever");
> 
> and see if that value is NULL.  If it is, then you are running on an OS that doesn't
> support that API call.  If it isn't in your DLL, then some DLL that is being loaded by
> your DLL is the guilty party, and youv'e got a more serious problem.
> 
> Note that your response to finding a NULL function pointer may be to issue a MessageBox
> saying that some functionality is not available, or to implement a workaround using some
> older or less-graceful set of API calls to simulate the desired behavior, or return an
> error code to the caller to indicate that the operation can't be done. 
> 
> Note that if you build the DLL with VC7, you've got several issues.  It could be using the
> newer CRT, or use an API defined in the latest platform SDK that may or may not be
> available in the actual target OS.  Also note that if the DLL Is using MFC, you've got
> additional confusion because you are involving two different CRT or MFC runtimes, which
> might lead to other problems that lead to the failure mode.  Mixing and matching like this
> has certain risks.
> 			joe
> ****
> 
>>The calling app was build with VC6, the DLL with VC7.
>>
>>Any help is greatly appreciated!
>>
>>Regards Christoph
> 
> Joseph M. Newcomer [MVP]
> email: newcomer@flounder.com
> Web: http://www.flounder.com
> MVP Tips: http://www.flounder.com/mvp_tips.htm
0
Christoph
12/20/2005 2:48:16 PM
Reply:

Similar Artilces:

Problems migrating BCM data into CRM SB edition
Hi There I am having a problem migrating data from Business Contacts Manager (BCM) into CRM 3.0 Small Business edition. I have downloaded the BCM data migration pack and have followed the data migration documentation to the letter. I even cleaned up the BCM database prior to copying the files, checking them for errors using the Manage Database option in the Business Tools menu. It gets so far through the migration process and then bombs out. Here is the final few entries from the log file: 28/10/2006 12:18:53------>Transitioning to next screen. From: ConfigurationSummary screen. To: ...

Problems with creating a newsletter
I chose the form "Newsletter - email". I have created a 3 page newsletter. Now, I have NO IDEA how to send it out as an email. I do not want to send it as an attachment. I cannot figure out which "save as" format or what I need to do so that i can email this newsletter. Is there a website that goes through how to do this? Am I correct when I say that it has to be html in order for me to send it as email? That is not one of the options. Any help you give me would be greatly appreciated. Thank you, Markis www.adreamforabetterworld.com ...

CSV File Problem
Can any one explain why the following problem occurs please? A colleague has a small list of data which is a csv file exported from SQL. Column One is a serial number from 1 to 29. Column 2 is a number of transactions which have occurred.(it should look like example A below in Excel) 1 475 1,475 2 1732 21,732 3 1670 31,670 4 2176 42,176 5 608 5,608 6 1579 61,579 7 43101 743,101 8 54512 854,512 9 51258 951,258 10 61050 1,061,050 A B If I double click on the csv file, it opens in Excel but c...

Customize Current View: Filter Problem
Hello, Using Outlook 2002, I have created a category called "Hidden" i outlook. In my calendar, I put all the appointments I don't want t appear in this calendar (i.e. daily reminders). I then filter out all these "Hidden" items by selecting -- View--> Current View--> Customize Current View--> Filter--> More Choices--> Categories--> Hidden (the category I created)--> OK--> SQL--> Edit these criteria directly--> And then I change: ("DAV:isfolder" = false AND "DAV:ishidden" = false) AN ("urn:schemas-microsoft...

Month problem
I have some code where I calculate this month minus 2 month. This goes fine until I get to august. When I use DateSerial to deduct 2 month I get to July, and this makes no sence. I made the following testcode. Sub StrangeMonth() Dim MyDate As Date MyDate = #8/31/2010# MsgBox DatePart("m", DateSerial(Year(MyDate), _ Month(MyDate) - 1, Day(MyDate))) ' MsgBox = 7 MsgBox DatePart("m", DateSerial(Year(MyDate), _ Month(MyDate) - 2, Day(MyDate))) ' MsgBox = 7 MsgBox DatePart(&qu...

Rounding Problem
I am using the following formula: ROUND((BH24-BG24)*24,1) Where BH24 = 15:21, BG24 = 15:00 (times based on a 24 hour clock) The answer returned is 0.3, but it should be 0.4. If you round out to 2 places the answer is 0.35. Unless I am missing something 0.35 should round to 0.4. If I use Roundup, it rounds everything up. What am I missing? Hi this is due to Excel's representation of numbers (see: http://www.cpearson.com/excel/rounding.htm) In your case the formula =(BH24-BG24)*24 does not return 0.35 but 0.3499999999999 (Just test it and format the resulting cell with enough decima...

Access 2007 and Vista code problem
I am developing a database on a XP SP2 machine. On a form I have created some buttons with event procedures that run 2 queries and open a form. I sent the db to someone running Access 2007 on a Vista machine and nothing happens when she clicks the buttons and there are no messages. I know nothing about Vista so thanks in advance for any help. Tim Might be a reference problem, have them open the open a code window and click tools references. See what says missing and tell them what should be there, Add it and it should work. Duff "Tim Reid" <TimReid@discussions.micr...

Resolving Email Address to existing contact problem
Has anyone else come across this issue in MSCRM3.0? - when you attempt to resolve an email address to an existing contact in CRM (that does not currently have an email address stored in their details) the contact resolves OK but does not update the email address in the contacts details. Is this by design, or have I found a bug? ...

Offline folder problems #2
Hi Guys, Basically I installed Outlook 97 on my office PC which is connect to microsoft exchange server. For some reason all of my messages were copied into offline folders, this causes a problem, whenever I open up outlook I get this message. Upload of offline changes could not be completed you do not have sufficient permission to perform this operation on this object. See the folder contact or see your system administrator. I do not administrator access on my user profile, every time I open outlook it resets everything I have changed (view etc) and gives that error message. How ...

OLK 2k7
Outlook is behaving strangly with the "through the selected account" option. Each time I restart Outlook the rule fails. When I go in to check on the rules I get told that the rule is "invalid". and the "SELECTED" account is no longer selected. Each time the criteria the account needs to be selected by changes. For example with the following data Account Name Email Account mailserver.domain1.com user@domain1.com mailserver.domain2.com user@domain2.com One time I go in and it's asking me to select the account ...

outlook 2k2 problem
I am using Outlook 2002 with SP3, and i have not had any problems up until a week ago. My password does not seem to save even though i have typed it in correctly in the e-mail acct settings ,and have checked "save password. It saves it as long as i have Outlook open, but as soon as i close it, and then later open it again, my password is gone and Outlook asks me for my e-mail password. So, i re-type and i check "save password". But if i decide to close Outlook (say for the evening, and shut down my computer or something), my password disappears the next time i open Outlo...

Office 2003 Service Pack 3--subsequent problems opening Publisher
I run Publisher 2003 on Windows XP. On June 13, I updated my system with Office 2003 Service Pack 3 so that I could open Word documents with the file ext docx. Subsequent to the Service Pack 3 installation, whenever I open a Publisher file (which I created), I get the following message: "Publisher has detected a problem in the file you are trying to open. If you are certain that this file came from a trusted source and does not contain harmful information, click OK." What is causing this and is there a way to stop this pop-up message? All publications? Error message when you...

Mother of a sumproduct (ish) problem!
At least it is to me - now I humbly beseech your magic :) A1 to A10 contain 10 unique letters, e.g. A,Q,E... B1 to B10 contain 10 unique letters, e.g. Z,B,A... C1 to C100 contain nonunique letters, e.g. E,E,F,E,Q,Q... D1 to D100 contain nonunique letters, e.g. A,T,F,A,X,B... E1 to E100 contain values, e.g. 9,1,3,5,7,2... In pseudo logic, for x = 1 to 10 I want to find each Ax:Bx pairing in Cy:Dy and sum E when matched. So I want to sum Ey for the rows where [Cy is "A" and Dy is "Z"], plus each Ey where [Cy="Q" and Dy="B"], etc. for the sample...

Hyperlink problem #3
I've got two workbooks on a shared drive with hyperlinks linking the two. When a user clicks on the hyperlink on the first workbook, it takes him to the second workbook. Fine. However, when the user clicks on the hyperlink in the second workbook to go back to the first, the error message says that that workbook is already open and it cannot open two files with the same name. Help is appreciated! I just tried a small test in xl2002 and it worked ok for me. I use Insert|Hyperlink to create the links. Are you sure that the hyperlinks point at the file you want--same folder and e...

CRM 3.0 Login Problems
Some specific users are constantly getting prompted for CRM login in Outlook. We are using desktop client (online) online. This happens randomly. We have CRM 3.0 with rollup update 2 and IE7. We have also applied this fix http://support.microsoft.com/default.aspx/kb/934243/en-us. Also added the crm site to local intranet zone. Please help. Thanks. set the authentication in IE check rollup update 2 -- Regards, Imran MS CRM Certified Professional http://microsoftcrm3.blogspot.com Chat with me on MSN / Gmail / Skype : ID Is :.. mscrmexpert@gmail.com "raj" wrote: >...

Spam is a big big problem
Spam is a big big problem ...

question about Time
How to make the time result for example if it�s ( 1:01 ) or higher shows only as ( 1:00 ) and if it�s Lower like ( 0:59 ) or less it will show the same result in this case ( 0:59 ) Any idea & suggestions. Thanks, almufadda@hotmail.com ------------------------------------------------ ~~ Message posted from http://www.ExcelTip.com/ ~~View and post usenet messages directly from http://www.ExcelForum.com/ Using Ron deBruin's google addin and asking for subject round time, I get http://tinyurl.com/wgua -- Don Guillett SalesAid Software donaldb@281.com "saud" <saud.xgc4...

Time Clock Systems
Does anyone have a recommendation for a time clock system that integrates well with GP? On Oct 5, 10:20 am, kcd <k...@discussions.microsoft.com> wrote: > Does anyone have a recommendation for a time clock system that integrates > well with GP? We just implemented Time Matrix by Business Computers (www.business- computers.com) and are very happy with it. We implemented quickly the hardware wasn't propietary or complicated so we were able to source our own stuff. Troy I can speak highly of Unitime's time and attendance system. They are a relatively low cost solution t...

Problem with Database Wizard
I'm trying to generate a diagram based on the contents of an Access database, using the database to provide x,y coords for instances of a Master shape. It seems I need to run the wizard twice, first to link a master, then to generate the drawing. The first bit appears to work OK, but when I do the second bit, Visio says that there is no master in the stencil that it can use. But I know the master is connected, because if I modify the database, then refresh the shapes, they change accordingly. Does anyone have any idea why this isn't working for me ? I'm using Visio 20...

Short time vs short date
In my form I have a fldOutOfRoom which the user inputs a short time into the field, i.e, 0900. I have the following code in the open event of another form called frmRNnotes: If DateDiff("h", Forms!frmPtDemographicNew!frmVisitNewEdit.Form!OutOfRoom, Now) >= 1 Then Me.cmdRNnotesEdit.Visible = False This code gives the RN one hour to complete a note and then he/she can no longer edit the note. What I want to know is the Short Time format going to let the cmdRNnotesEdit button be visible everyday within one hour of the of the original time? That is, is the short time just a tim...

Strange problem
We have been rolling out new Windows 7 workstations (all new computers) at work over the last few months and a strange problem has developed. Prior to Windows 7 we were using Windows XP with Office 2007. The problem is, we have a workbook which uses a UserForm for filling in all required information. Prior to rolling out the new Windows 7 workstations, the workbook and UserForm were working flawlessly (for over a year) and they still work flawlessly on the first 3 Windows 7 workstations but on the last 2 workstations we rolled out if you open the UserForm and leave it open for ...

Some Excel formatting functions taking a long time to work #2
Excel 2000 SP3 When I use some formatting functions for the first time in a session, such as bold, increasing font size etc, it takes up to 30 seconds to work. Meantime Excel is locked up until it completes that formatting call. I suspect faulty DLL? Has anyone experienced this? How to fix (other than a complete re- install) ? Any advice appreciated. Piri On Nov 5, 8:39=A0am, Piri <wiremu.pare...@hotmail.com> wrote: > Excel 2000 SP3 > When I use some formatting functions for the first time in a > session, such as bold, increasing font size etc, it takes =A0up to 30 > secon...

Adding a word to the end of other words at the same time
I was wondering if there was a way to add a word to the end or beginning of multiple other words in Excel. Example; say I have these 3 words.... Alpha Beta Tera Now I want to add LLC to the end of each word but I want to change them all at the same time. Like Alpha LLC Beta LLC Tera LLC Is there a way to do that? Phil Its Excel 2003 try Sub addtexttoend() For Each c In Selection c.Value = c & " xxx" Next End Sub -- Don Guillett SalesAid Software donaldb@281.com "phil" <ptukey@charter.net> wrote in message news:1125340358.873337.4240@g44g2000cwa.googlegroup...

HELP! Outlook POP3 problem(s)
Hello. I am so lost. I have a few e-mail accounts set up on my computer which retrieves my mail from a couple of different providers and deposits the mail into my Outlook Inbox. Up until yesterday, my mail always has worked fine. For some strange reason, my Outlook is now (Again) retrieving my messages from all of my accounts I had set up, which are all duplicates of my messages. There is now nearly 4,000 duplicate messages in my folders. I can't seem to stop the download of these already retrieved messages. To top things off, a couple of my email account login windows keep p...

TABSTOP problem
I have a dialog where in depending on the selection from a combo box, the controls below are going to be different. For doing this I have put a static control in the place where I am going to show different controls. I have created different dialog templates for each option. Consider the case of particular option, say "MySQL". Corresponding to this option, there is a dialog in resource, the style of which is child and no border. I have added a class for this dialog called CMySQLDialog. Inside CMySQLDialog there is a function called CreateFromStatic which takes parent and ID as parame...