Как добавить значок в приложение c с помощью компилятора Digital Mars (rcc.exe и dmc.exe )

#c #windows #compilation #resources #icons

#c #Windows #Сборник #Ресурсы #Значки

Вопрос:

Я работаю над проектом, в котором я должен использовать компилятор Digital Mars c . Мне нужно добавить значок в мой .exe файл. Я знаю, как добавить значок в Visual Studio, но это не так, потому что я работаю над Digital Mars (мне нужно пошаговое руководство по командной строке, чтобы добавить значок, который, как я предполагаю, VS делает в фоновом режиме). Мой проект содержит файл ресурсов в виде Hello.rc :

 #include "resource.h"

MAINICON ICON "icon.ico"
MY_RESOURCE RCDATA "a.txt"
  

Файл заголовка ресурса как resource.h :

 #define MAINICON      101    
#define RCDATA    256
#define ICON    257
#define MY_RESOURCE 300
  

И основной файл в виде Hello.cpp :

 #include <iostream>
#include <windows.h>
#include <cstdio>
#include "resource.h"

using namespace std;

void LoadFileInResource(int name, int type, DWORDamp; size, const char*amp; data)
{
    HMODULE handle = ::GetModuleHandle(NULL);
    HRSRC rc = ::FindResource(handle, MAKEINTRESOURCE(name),
        MAKEINTRESOURCE(type));
    HGLOBAL rcData = ::LoadResource(handle, rc);
    size = ::SizeofResource(handle, rc);
    data = static_cast<const char*>(::LockResource(rcData));
}

// Usage example
int main()
{
    DWORD size = 0;
    const char* data = NULL;
    LoadFileInResource(MY_RESOURCE, RCDATA, size, data);    
    char snum[5];

    // convert 123 to string [buf]
    itoa(size, snum, 10);

    // print our string
    printf("%sn", snum);
    /* Access bytes in data - here's a simple example involving text output*/
    // The text stored in the resource might not be NULL terminated.
    char* buffer = new char[size 1];    
    ::memcpy(buffer, data, size);
    buffer[size] = 0; // NULL terminator
    ::printf("Contents of text file: %sn", buffer); // Print as ASCII text
    delete[] buffer;
    return 0;
}
  

Я компилирую свой проект, используя следующие команды. В результате .exe можно прочитать содержимое a.txt , но значок не отображается.

 rcc hello.rc
dmc hello.cpp hello.rc
  

Что-то не так с моим кодом или мне следует использовать другую команду?

Комментарии:

1. Не уверен, может быть, это поможет: digitalmars.com/faq.html#classexpress

2. Также здесь есть ссылка на компилятор ресурсов Digital Mars. Вероятно, вам нужно более подробно изучить их документацию, которая кажется довольно полной.

3. Я изучил части, связанные с rcc.exe , но не смог найти ничего полезного

4. ICON и RCDATA являются стандартными типами ресурсов, их не следует переопределять. Компилятор ресурсов должен распознать ICON . Удалить #define ICON 257 . Поместите 1 ICON "icon.ico" файл ресурсов, скомпилируйте и свяжите. Обратите внимание, что Windows будет кэшировать значок для каждого файла, поэтому вы не узнаете, удалось ли вам это, пока не перезагрузите систему и кэш значков не очистится. Вы также можете скопировать / вставить * .exe-файл с другим именем, чтобы обмануть систему, чтобы она не использовала тот же кэш для этого файла.

5. Я не знаком с этим компилятором. Используйте -32 опцию для 32-разрядного ресурса — см. Ссылку . Ваш вывод * .exe 16-разрядный или 32-разрядный? Если он 32-разрядный, попробуйте использовать значок 256 цветов (помните, что изменения значка могут не отображаться до перезагрузки).