从资源中提取错误1814

时间:2018-09-28 15:43:18

标签: c++ winapi resources

尝试从资源加载可执行文件时,出现错误1814,显然我似乎不明白为什么会这样。 我的源代码看起来像这样

Resource.h

IDR_EXE1 EXE  "C:\\Users\\*****\\Documents\\Visual Studio 2015\\Projects\\HelloWorldMessageBoxExample\\Debug\\HelloWorldMessageBoxExample.exe"

现在,我的从资源加载它的源代码如下:

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include "resource.h"

int main()
{
    HMODULE hModule = GetModuleHandle(NULL);
    HRSRC hrsrc = FindResource(hModule, MAKEINTRESOURCE("IDR_EXE1"), L"EXE");

    if (hrsrc == NULL) {
        printf("Error finding Resource, Reason :%d", GetLastError());
        getchar();
    }
    HGLOBAL hLoaded = LoadResource(NULL, hrsrc);
    if (hLoaded == NULL) {
        printf("Error Loading Resource, Reason: %d", GetLastError());
        getchar();
    }
    LPVOID lpLock = LockResource(hLoaded);
    if (lpLock == NULL) {
        printf("Error Loading Locking Resource, Reason: %d", GetLastError());
        getchar();
    }
    DWORD dwSize = SizeofResource(NULL, hrsrc);
    if (dwSize == NULL) {
        printf("Cannot Get Size of Resource, Reason: %d", GetLastError());
        getchar();
    }
    HANDLE hFile = CreateFile(L"C:\\Users\\*******\\AppData\\Local\\vaxi\\hiMsg.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == NULL) {
        printf("Cannot Create File,Reason : %d", GetLastError());
        getchar();
    }
    DWORD dwBytesWritten;
    if (!WriteFile(hFile, lpLock, dwSize, &dwBytesWritten, NULL))
    {
        printf("Write File Failed,Reason : %d", GetLastError());
    }
    if (!CloseHandle(hFile))
    {
        printf("Close Handle Failure, Reason: %d", GetLastError());
    }
    else {
        printf("Extracted Correctly!\n");
    }
    if (!ShellExecuteA(NULL, "open", (char*)hFile, 0, 0, SW_SHOWNORMAL)) {
        printf("Shell Execute Failed, Reason: %d", GetLastError());
    }
    return 0;
}

我仍然收到错误1814,这里到底是什么错误?

1 个答案:

答案 0 :(得分:4)

错误代码1814ERROR_RESOURCE_NAME_NOT_FOUND

  

在图像文件中找不到指定的资源名称。

错误是正确的。 MAKEINTRESOURCE("IDR_EXE1")产生了错误的名称,因此找不到资源。您正在滥用MAKEINTRESOURCE()宏。正确的用法是MAKEINTRESOURCE(IDR_EXE1)