win32 wstring <-> string

static std::string w2c(std::wstring str)
	{
		int nlength = str.length();
		int nbytes = WideCharToMultiByte(0,0,str.c_str(),nlength,NULL,0,NULL,NULL);
		if(nbytes == 0) return "";

		char*buff = new char[nbytes+1];
		WideCharToMultiByte(0,0,str.c_str(),nlength,buff,nbytes,NULL,NULL);
		buff[nbytes] = '\0';
		std::string ret_str = std::string(buff);
		delete [] buff;
		return ret_str;		
	}

static std::wstring c2w(std::string str)
	{
		if(str.length() == 0) return std::wstring();

		int nu = str.length();
		size_t n =(size_t)MultiByteToWideChar(CP_ACP,0,str.c_str(),nu,NULL,0);
		wchar_t*wbuff = new wchar_t[n+1];
		MultiByteToWideChar(CP_ACP,0,str.c_str(),(int)nu,wbuff,(int)n);
		wbuff[n] = 0;

		std::wstring wstr_ret = std::wstring(wbuff);
		delete []wbuff;
		return wstr_ret;
	}



转载于:https://my.oschina.net/lyr/blog/375799

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个实现替换exe图标的函数: ```c++ #include <Windows.h> #include <string> BOOL SetExeIcon(LPCWSTR exePath, LPCWSTR iconPath) { // 加载图标资源 HICON hIcon = (HICON)LoadImage(NULL, iconPath, IMAGE_ICON, 0, 0, LR_LOADFROMFILE); if (!hIcon) return FALSE; // 打开exe文件 HANDLE hFile = CreateFileW(exePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { DestroyIcon(hIcon); return FALSE; } // 获取exe文件的文件头 IMAGE_DOS_HEADER dosHeader; DWORD bytesRead; if (!ReadFile(hFile, &dosHeader, sizeof(dosHeader), &bytesRead, NULL) || bytesRead != sizeof(dosHeader) || dosHeader.e_magic != IMAGE_DOS_SIGNATURE) { CloseHandle(hFile); DestroyIcon(hIcon); return FALSE; } // 获取PE文件头 IMAGE_NT_HEADERS ntHeader; if (!SetFilePointer(hFile, dosHeader.e_lfanew, NULL, FILE_BEGIN) || !ReadFile(hFile, &ntHeader, sizeof(ntHeader), &bytesRead, NULL) || bytesRead != sizeof(ntHeader) || ntHeader.Signature != IMAGE_NT_SIGNATURE) { CloseHandle(hFile); DestroyIcon(hIcon); return FALSE; } // 获取资源目录表 IMAGE_DATA_DIRECTORY resourceDir = ntHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]; if (resourceDir.VirtualAddress == 0 || resourceDir.Size == 0) { CloseHandle(hFile); DestroyIcon(hIcon); return FALSE; } // 获取资源目录表的位置 DWORD resourceDirOffset = resourceDir.VirtualAddress + dosHeader.e_lfanew; if (!SetFilePointer(hFile, resourceDirOffset, NULL, FILE_BEGIN)) { CloseHandle(hFile); DestroyIcon(hIcon); return FALSE; } // 获取资源目录表 IMAGE_RESOURCE_DIRECTORY resDir; if (!ReadFile(hFile, &resDir, sizeof(resDir), &bytesRead, NULL) || bytesRead != sizeof(resDir)) { CloseHandle(hFile); DestroyIcon(hIcon); return FALSE; } // 获取资源目录项 IMAGE_RESOURCE_DIRECTORY_ENTRY resDirEntry; if (!ReadFile(hFile, &resDirEntry, sizeof(resDirEntry), &bytesRead, NULL) || bytesRead != sizeof(resDirEntry)) { CloseHandle(hFile); DestroyIcon(hIcon); return FALSE; } // 找到图标资源的位置 DWORD iconResOffset = resDirEntry.OffsetToData & 0x7FFFFFFF; if (!SetFilePointer(hFile, resourceDirOffset + iconResOffset, NULL, FILE_BEGIN)) { CloseHandle(hFile); DestroyIcon(hIcon); return FALSE; } // 获取图标资源头 IMAGE_RESOURCE_DATA_ENTRY iconDataEntry; if (!ReadFile(hFile, &iconDataEntry, sizeof(iconDataEntry), &bytesRead, NULL) || bytesRead != sizeof(iconDataEntry)) { CloseHandle(hFile); DestroyIcon(hIcon); return FALSE; } // 读取图标数据 BYTE* iconData = new BYTE[iconDataEntry.Size]; if (!ReadFile(hFile, iconData, iconDataEntry.Size, &bytesRead, NULL) || bytesRead != iconDataEntry.Size) { CloseHandle(hFile); DestroyIcon(hIcon); delete[] iconData; return FALSE; } // 替换图标数据 ICONHEADER* iconHeader = (ICONHEADER*)iconData; iconHeader->idReserved = 0; iconHeader->idType = 1; iconHeader->idCount = 1; ICONDIRENTRY* iconDirEntry = (ICONDIRENTRY*)(iconData + sizeof(ICONHEADER)); iconDirEntry->bWidth = GetSystemMetrics(SM_CXICON); iconDirEntry->bHeight = GetSystemMetrics(SM_CYICON); iconDirEntry->bColorCount = 0; iconDirEntry->bReserved = 0; iconDirEntry->wPlanes = 1; iconDirEntry->wBitCount = 32; iconDirEntry->dwBytesInRes = iconDataEntry.Size - sizeof(ICONHEADER) - sizeof(ICONDIRENTRY); iconDirEntry->dwImageOffset = sizeof(ICONHEADER) + sizeof(ICONDIRENTRY); BYTE* iconImage = iconData + iconDirEntry->dwImageOffset; BITMAPINFOHEADER* biHeader = (BITMAPINFOHEADER*)iconImage; biHeader->biSize = sizeof(BITMAPINFOHEADER); biHeader->biWidth = GetSystemMetrics(SM_CXICON); biHeader->biHeight = GetSystemMetrics(SM_CYICON) * 2; biHeader->biPlanes = 1; biHeader->biBitCount = 32; biHeader->biCompression = BI_RGB; biHeader->biSizeImage = iconDirEntry->dwBytesInRes; BYTE* iconBits = iconImage + sizeof(BITMAPINFOHEADER); GetIconInfo(hIcon, NULL, (BITMAPINFO*)biHeader, (void**)&iconBits); DestroyIcon(hIcon); // 写入替换后的图标数据 iconDataEntry.Size = iconDataEntry.Size; if (!SetFilePointer(hFile, -(LONG)bytesRead, NULL, FILE_CURRENT) || !WriteFile(hFile, iconData, iconDataEntry.Size, &bytesRead, NULL)) { CloseHandle(hFile); delete[] iconData; return FALSE; } // 清理资源 delete[] iconData; CloseHandle(hFile); return TRUE; } ``` 使用方法如下: ```c++ std::wstring exePath = L"path/to/exe.exe"; std::wstring iconPath = L"path/to/icon.ico"; if (SetExeIcon(exePath.c_str(), iconPath.c_str())) { // 替换成功 } else { // 替换失败 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值