• 如何在静态库中嵌入资源


    参见我的GitHub回购。 介绍 它始于一个需要发布一个静态库作为一个产品,包括一些资源。这通常是不可能因为一个程序,使用这样的静态库将使用自己的资源。我发布一个问题(我回答后发现这个解决方案)。我意识到这个解决方案值得与源代码的一篇文章。我也发布了一个关于这种可能性在堆栈溢出的问题。 在另一个场合我希望我任何类型的静态库嵌入另一个文件(可以是一个可执行文件,DLL,照片,文件,等等)和提取它在运行时。 一些代码示例 源由一个静态库项目(“MH_EmbedDataLib”)和一个测试控制台应用程序(“ConsoleApp”)。当然,如果它与GUIless控制台应用程序,它将与其他类型,即。Win32 MFC,等等。 MH_EmbedDataLib图书馆 MH_EmbedDataLib图书馆有两个主要功能: 让图标 隐藏,复制Code

    HICON GetIcon()
    {
        DWORD dwTmp;
        int offset;
        HANDLE hFile;
        HICON hIcon = NULL;
    
        offset = LookupIconIdFromDirectoryEx(s_byIconData, TRUE, 0, 0, LR_DEFAULTCOLOR);
    
        if (offset != 0)
        {
            hIcon = CreateIconFromResourceEx
            (s_byIconData + offset, 0, TRUE, 0x00030000, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
        }
    
        return hIcon;
    }

    提供你一个图标您希望使用转换为静态数组的字节,并命名为s_byIconData, GetIcon加载图标从这个静态数据(s_byIconData)。 LookupIconIdFromDirectoryEx函数用于搜索图标的图标或光标或指针数据最适合当前的显示设备。 然后CreateIconFromResourceEx用来创建图标的资源位描述,由Bin2C生成的。 DisplayMessageWithIcon 隐藏,复制Code

    void DisplayMessageWithIcon(LPWSTR message)
    {
        XMSGBOXPARAMS xmb;
        //xmb.hInstanceIcon = (HINSTANCE)GetIcon();
        xmb.dwOptions |= XMSGBOXPARAMS::RightJustifyButtons;
        xmb.crBackground = RGB(255, 255, 255);
        xmb.crText = RGB(10, 135, 180);
        xmb.nIdIcon = 101;
        xmb.nTimeoutSeconds = 5;
        XMessageBox(NULL,
            message,
            L"Code Project article by Michael Haephrati",
            MB_YESNO, &xmb);
    }

    这个函数封装在s_byIconData显示一个消息框显示图标。 这个过程 选择您希望使用照片,或一个图像。一个网站叫ICO大多数图像类型的转换提供了服务转化为ICO文件。ico文件之后,打开它看到转换顺利。然后使用Bin2C转换成字节数组。确保您使用正确的静态数组的名称。(在本例中,我们使用s_byIconData)。然后弹出窗口将显示它。对于本文的目的,我使用Nigara瀑布的照片(加拿大当然…)所示。 结果并不伟大但演示此概念。 XMessageBox 的消息框中使用本文的代码是由汉斯迪特里希。 从一个数组创建临时文件 另一个例子,本文的目的是使用相同的数组由Bin2C特别代文件在运行时。 隐藏,复制Code

    bool Array2TempFile(char *arr, size_t len,WCHAR *file)
    {
    	HANDLE hFile = CreateFile(file, GENERIC_WRITE, // open for writing
    		FILE_SHARE_WRITE, // share for writing
    		NULL, // default security
    		CREATE_ALWAYS, // create new file only
    		FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_ARCHIVE | SECURITY_IMPERSONATION,
    		// normal file archive and impersonate client
    		NULL); // no attr. template
    
    
    	DWORD bytes;
    	if (hFile != INVALID_HANDLE_VALUE)
    	{
    		WriteFile(hFile, &arr[0], len, &bytes, NULL);
    		CloseHandle(hFile);
    		return true;
    	}
    
    	return false;
    }

    我用这个函数从一个静态库中提取并安装内核驱动程序。这是一个例子的使用。 隐藏,复制Code

    INF_PATH

    和隐藏,复制Code

    SYS_PATH

    是预定义的。 隐藏,复制Code

    int len;
    // Extract .inf file for x86 Win 10
    len = (int)sizeof(sgdrv86_10_inf);
    Array2TempFile((char *)&sgdrv64_10_inf[0], len, INF_PATH);
    // Extract .sys file for x86 Win 10
    len = (int)sizeof(sgdrv86_10_sys);
    Array2TempFile((char *)&sgdrv86_10_sys[0], len, SYS_PATH);
    

    本文转载于:http://www.diyabc.com/frontweb/news5076.html

  • 相关阅读:
    MVC3.0 如何点击点击一张图片连接到另一地址
    什么是SMTP?
    ASP.NET MVC中 Jquery AJAX 获取数据利用MVC模型绑定实现输出
    MVC HTML控件扩展例子
    连接局域网内的mysql服务
    python loger 模板
    培养正确的编程态度和方法转
    Chrome不支持showModalDialog模态对话框和无法返回returnValue的问题
    SQL中时间与秒互转
    VS开发好用的扩展
  • 原文地址:https://www.cnblogs.com/Dincat/p/13462265.html
Copyright © 2020-2023  润新知