程式語言 - Wine - C/C++ - Resource - RCData



參考資訊:
http://www.winprog.org/tutorial/
http://winapi.freetechsecrets.com/win32/
https://github.com/gammasoft71/Examples_Win32
http://masm32.com/board/index.php?topic=3584.0
https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles

main.c

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "resource.h"

void DropFile(HINSTANCE hInstance, DWORD dwID, TCHAR *pResType, TCHAR *pFileName)
{
    DWORD dwRet = 0;
    HRSRC hRes = FindResource(hInstance, MAKEINTRESOURCE(dwID), pResType);
    HGLOBAL hRsc = LoadResource(hInstance, hRes);
    LPVOID lpRsc = (unsigned char *)LockResource(hRsc);

    DWORD dwFileSize = SizeofResource(hInstance, hRes);
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    LPVOID pvData = GlobalLock(hGlobal);
    memcpy(pvData, lpRsc, dwFileSize);
    HANDLE hFile = CreateFile(pFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    WriteFile(hFile, pvData, dwFileSize, &dwRet, NULL);
    CloseHandle(hFile);
    GlobalUnlock(hGlobal);
    GlobalFree(hGlobal);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    DropFile(hInstance, IDD_ELF, "DATA", "tmp.exe");
    DropFile(hInstance, IDD_LIB, "DATA", "tmp.exe.so");
    ExitProcess(0);
    return 0;
}

main.rc

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

IDD_ELF DATA "test.exe"
IDD_LIB DATA "test.exe.so"

resource.h

#define IDD_ELF 101
#define IDD_LIB 102

編譯、執行

$ x86_64-w64-mingw32-windres main.rc -o main.res
$ winegcc main.c main.res -o main
$ wine ./main.exe