NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Chyba při definici IKON ve více soborech zdrojů *.rc (Visual Studio)

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Hadraba:14.6.2024 9:36

Používám Visual Studio a potřebuji vytvořit dva soubory zdrojů (.rc) a v každém mít ikonu. Mám část kódu, včetně dialogu (a tedy i .rc), který sdílí více aplikací.
Visual Studio z nějakého důvodu generuje při kompilaci chybu, pokud jsou v obou rc souborech ikony:

CVT1100 duplicate resource. type:ICON, name:1, language:0x0405

Zkusil jsem: Hledat na Stack Overflow, ale řešení tam víceméně není.
Zkoušel jsme vyhodit z jednoho .rc souboru specifikacei jazyka, ale to vedlo jen k tomu, že kompilátor sice aplikaci zkopiloval, ale ikonu nahradil jinou ikonou.
Kontroloval jsme v soboru resource.h unikátnost definice jednotlivých konstant IDI_ICON....

Chci docílit: Vytvořit část kódu, který sdílí více aplikaci na úrovni zdrojového kódu.

Editováno 14.6.2024 9:37
 
Odpovědět
14.6.2024 9:36
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Hadraba
DarkCoder:15.6.2024 10:31

Ikona v každém .rc souboru musí mít svůj vlastní identifikator.

resource1.rc

#define IDI_ICON1 101

IDI_ICON1 ICON "path_to_icon1.ico"

resource2.rc

#define IDI_ICON2 102

IDI_ICON2 ICON "path_to_icon2.ico"
Nahoru Odpovědět
15.6.2024 10:31
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Michal Hadraba:17.6.2024 10:05

Ahoj, díky za odpověď. jenomže právě problém je, že i když jsou ty identifikátory unikátní, hází to tu chybu.

 
Nahoru Odpovědět
17.6.2024 10:05
Avatar
Michal Hadraba:17.6.2024 10:12

Ilustrativní obrázek...

 
Nahoru Odpovědět
17.6.2024 10:12
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Hadraba
DarkCoder:17.6.2024 13:11

Z toho co si poslal je patrné, že používáš stejný identifikátor v obou souborech. To může vést k chybě kompilace pokud v hlavním resource souboru vkládaš oba soubory.

Buď použij podmíněnou kompilaci:

#ifdef USE_RESOURCE1
#include "resource1.rc"
#endif

#ifdef USE_RESOURCE2
#include "resource2.rc"
#endif

Nebo zcela odděl oba soubory:

resource1.rc

#include "resource.h"
IDI_ICON1 ICON "path_to_icon1.ico"

resource2.rc

#include "resource1.h"
IDI_ICON2 ICON "path_to_icon2.ico"  // Změněné makro pro odlišení
// resource.h
#define IDI_ICON1 129

// resource1.h
#define IDI_ICON2 505  // Změněné makro pro odlišení
Nahoru Odpovědět
17.6.2024 13:11
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Michal Hadraba:17.6.2024 13:46

To jsem stvořil špatný příklad, to se omlouvám. Ale bohužel právě tím to není. I když ty názvy opravím, aby byly unikátní, furt to chybuje.

 
Nahoru Odpovědět
17.6.2024 13:46
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Hadraba
DarkCoder:17.6.2024 14:00

Hoď jsem ještě všechny .rc soubory

Nahoru Odpovědět
17.6.2024 14:00
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Michal Hadraba:17.6.2024 14:15

MFCApplication1.rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#include "verrsrc.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Czech (Czech Republic) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY)
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#include ""afxres.h""\r\n"
    "#include ""verrsrc.h""\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
    "LANGUAGE 9, 1\r\n"
    "#include ""res\\MFCApplication1.rc2""  // non-Microsoft Visual C++ edited resources\r\n"
    "#include ""afxres.rc""      // Standard components\r\n"
    "#if !defined(_AFXDLL)\r\n"
    "#include ""afxribbon.rc""   // MFC ribbon and control bar resources\r\n"
    "#endif\r\n"
    "#endif\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME           ICON                    "res\\MFCApplication1.ico"

IDI_ICON2               ICON                    "res\\icon1.ico"

#endif    // Czech (Czech Republic) resources
/////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////
// English (United States) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About MFCApplication1"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    ICON            IDR_MAINFRAME,IDC_STATIC,14,14,21,20
    LTEXT           "MFCApplication1, Version 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX
    LTEXT           "Copyright (C) 2024",IDC_STATIC,42,26,114,8
    DEFPUSHBUTTON   "OK",IDOK,113,41,50,14,WS_GROUP
END

IDD_MFCAPPLICATION1_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,209,179,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,263,179,50,14
    CTEXT           "TODO: Place dialog controls here.",IDC_STATIC,10,96,300,8
END


/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904B0"
        BEGIN
            VALUE "CompanyName", "TODO: <Company name>"
            VALUE "FileDescription", "MFCApplication1"
            VALUE "FileVersion", "1.0.0.1"
            VALUE "InternalName", "MFCApplication1.exe"
            VALUE "LegalCopyright", "TODO: (c) <Company name>.  All rights reserved."
            VALUE "OriginalFilename", "MFCApplication1.exe"
            VALUE "ProductName", "TODO: <Product name>"
            VALUE "ProductVersion", "1.0.0.1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 163
        TOPMARGIN, 7
        BOTTOMMARGIN, 55
    END

    IDD_MFCAPPLICATION1_DIALOG, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 313
        TOPMARGIN, 7
        BOTTOMMARGIN, 193
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE
BEGIN
    IDS_ABOUTBOX            "&About MFCApplication1..."
END

#endif    // English (United States) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\MFCApplication1.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"      // Standard components
#if !defined(_AFXDLL)
#include "afxribbon.rc"   // MFC ribbon and control bar resources
#endif
#endif

/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

Resource.rc

// Microsoft Visual C++ generated resource script.
//
#include "resource1.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Czech (Czech Republic) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY)
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource1.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//

IDB_BITMAP1             BITMAP                  "G:\\Dokumenty\\Visual Studio Projects\\MajCut\\_Icons\\checkboxes.bmp"


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1               ICON                    "G:\\Dokumenty\\Visual Studio Projects\\_Spolecny\\_Materialy\\_Icons\\copy_CB.ico"

#endif    // Czech (Czech Republic) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED
 
Nahoru Odpovědět
17.6.2024 14:15
Avatar
Michal Hadraba:17.6.2024 14:18

Pokud hodím ikony do jednoho, tak pak můžu mít rc souborů třeba 1000 a je to cajk. Ale jakmile je začnu vkládat (jenom ikony) do různých hází to tuto chybu. Vyřešil jsme to provizorně tak, že jsme si vytvořil soubor ikony.rc2 a ten explicitně vkládám do rc souboru. Ale to je takové kostrbaté.

 
Nahoru Odpovědět
17.6.2024 14:18
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Hadraba
DarkCoder:17.6.2024 16:26

Z těchto dvou .rc souborů není patrná duplicita. Nemáš v projektu další zdroje jako např. MFCApplication1­.rc2?

Vyhledej v celém projektu identifikátory IDI_ICON1 a IDI_ICON2. Duplicita bude pravděpodobně v jiném .rc2 souboru.

Nahoru Odpovědět
17.6.2024 16:26
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.