PRB: AfxFindResourceHandle Fails w/ Icons, Cursors, & Strings

Last reviewed: August 7, 1997
Article ID: Q148305
1.50 1.51 1.52 | 2.00 2.10 2.20 4.00
WINDOWS        | WINDOWS NT
kbusage kbcode kbprb

The information in this article applies to:

  • The Microsoft Foundation Classes (MFC) included with:

        - Microsoft Visual C++ for Windows, versions 1.5, 1.51, and 1.52
        - Microsoft Visual C++, 32-bit Edition, versions 2.0, 2.1, 2.2, 4.0
    

SYMPTOMS

AfxFindResourceHandle() fails when searching for icon (RT_ICON), cursor (RT_CURSOR), and string resources (RT_STRING).

CAUSE

This occurs because of how the Windows API function FindResource, which is called by AfxFindResourceHandle(), is designed.

RESOLUTION

For icons and cursors, use the RT_GROUP_ICON or RT_GROUP_CURSOR resource type with AfxFindResourceHandle() to return the EXE or DLL instance where the resource is located, and then call ::LoadIcon() or ::LoadCursor() to load the resource.

For string resources, call CString::LoadString(). It will search the EXE and MFC extension DLLs for the string resource, and load it into the CString.

STATUS

This behavior is by design.

MORE INFORMATION

AfxFindResourceHandle is an _AFXDLL-specific API for walking the resource list to look for a given match. It takes the name and type of a resource and returns the resource handle where it was first found (or NULL). It is documented in MFC Technote TN033: DLL Version of MFC.

Sample Code

The following sample code shows successful uses of RT_GROUP_ICON and RT_GROUP_CURSOR:

// This sample code can be placed in any MFC application or DLL
// that links with the DLL version of MFC. Create an icon with ID
// IDI_ICON1 and a cursor with ID IDC_CURSOR1. Call TestLoadIconCursor
// from CWinApp::Initinstance().

HICON MyLoadIcon( LPCTSTR lpIconName ) {
    return ::LoadIcon(AfxFindResourceHandle(lpIconName, RT_GROUP_ICON),
                      lpIconName);
}

HCURSOR MyLoadCursor ( LPCTSTR lpCursorName ) {
    return ::LoadCursor(AfxFindResourceHandle(lpCursorName,
                        RT_GROUP_CURSOR),
                        lpCursorName);
}

void TestLoadIconCursor(void)
{
    HICON   hIcon;
    HCURSOR hCur;
    LPCTSTR lpcszRes;

    lpcszRes = MAKEINTRESOURCE(IDI_ICON1);
    hIcon = MyLoadIcon( lpcszRes );
    ASSERT (hIcon != NULL);

    lpcszRes = MAKEINTRESOURCE(IDC_CURSOR1);
    hCur = MyLoadCursor( lpcszRes );
    ASSERT (hCur != NULL);
}


Additional reference words: 2.5 2.50 2.51 2.52 3.0 3.00 3.1 3.10 3.2
3.20 AfxFindResourceHandle FindResource
KBCategory: kbusage kbcode kbprb
KBSubcategory: MfcDLL MfcMisc
Keywords : MfcDLL MfcMisc kbcode kbprb kbusage
Technology : kbMfc
Version : 1.50 1.51 1.52 | 2.00 2.10 2.20
Platform : NT WINDOWS


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: August 7, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.