jey*_*jow 0 c++ const createfile lpwstr
好的,我的程序有问题.我之前提出过一个问题,但没有人真正理解我的问题,所以我这次尝试一种新方法.
如果你很好奇,这是我的问题:
我的程序以形式接受参数
char* argv[],并且我无法指向正在argv[1]使用的任何东西LPWSTR,因为它只指向const wchar_t*对象.
这是一个新的事情,我试图解决我的问题(我已经尝试了多种东西,但我需要知道如何做我想的,或者如果可能的话)
基本上,我的想法是#define某种功能,它可以接受任何内容,argv[1]并const wchar_t*使用该值定义a .
像这样的东西:
#define path ((const wchar_t*)argv[1])
Run Code Online (Sandbox Code Playgroud)
我不确定这是正确的方式(或者即使这是可能的)做我想做的事......
如果你有一个更好的方法来解决我的问题,请(请)告诉我如何帮助我,我一直在考虑这个很长的时间!
我的计划说明:
我正在制作一个接受争论的程序.参数是驱动器的名称,例如"F:".然后它使用
CreateFile带驱动器号的函数.如果你去这里,看看函数的第一个参数,我想你会看到我的意思....问题是,对于我来说,制作一个LPWSTR,我需要一个const wchat_t*对象....我希望这一次我的问题很清楚,上次人们真的不明白我想要做什么.
无论如何,谢谢!编辑1:这里是解决我的程序的行(这是我必须做的工作,没有参数)(我在这里使用固定值)
int main()
{
HANDLE device;
device = CreateFile(L"\\\\.\\F:", // Drive to open
GENERIC_READ | GENERIC_WRITE, // Access mode
FILE_SHARE_READ | FILE_SHARE_WRITE, // Share Mode
NULL, // Security Descriptor
OPEN_EXISTING, // How to create
0, // File attributes
NULL);
}
Run Code Online (Sandbox Code Playgroud)
这是有参数(不起作用)
int main(int argc, char* argv[])
{
HANDLE device;
device = CreateFile(argv[1], // Drive to open
GENERIC_READ | GENERIC_WRITE, // Access mode
FILE_SHARE_READ | FILE_SHARE_WRITE, // Share Mode
NULL, // Security Descriptor
OPEN_EXISTING, // How to create
0, // File attributes
NULL); // Handle to template
}
Run Code Online (Sandbox Code Playgroud)
^这显示了我想要做的事情
编辑2:我改变了CreateFile对CreateFileA了,这是eroor代码它给我(驱动d是一个USB接口,它不是一个硬盘驱动器)

因此,除非我输入错误的方式键入路径,它总是给我错误.我认为生病尝试另一种方法来解决问题,或者如果有人知道为什么错误发生,请告诉我!
编辑2:我将CreateFile更改为CreateFileA,这是它给我的eroor代码(驱动器D是USB,它不是硬盘)
这是一个完全不同的问题,与此无关wchar_t.
在你的第一个剪辑中你通过了"\\\\.\\F:"(AKA \\.\F:一旦我们删除了C逃逸); 在您从命令行尝试的所有尝试中,您从未提供此路径,但分别是:
D- 所以它试图打开一个D在当前目录中命名的文件,它没有找到它(错误2,又名ERROR_FILE_NOT_FOUND);D:\- 根目录,无法打开CreateFile(错误3,又名ERROR_PATH_NOT_FOUND),D:- 驱动器D:上的当前目录,再次无法打开CreateFile(错误5,又名ERROR_ACCESS_DENIED);\D:- 当前驱动器根目录中名为"D:"的文件,如果该D:文件不是有效文件名,则无法创建该文件(错误123,又名ERROR_INVALID_NAME).要将驱动器作为设备打开,必须使用\\.\X:路径(X驱动器号在哪里); 你不能只是扔掉你心中的任何花车,并希望它能起作用.从命令行传递调用您的程序"\\.\D:",它将正常工作.
当然,如果你想让用户更简单,你可以只接受命令行上的驱动器号并编写一些代码来创建CreateFile基于它的所需字符串.
if(argc<1) {
printf("Not enough arguments\n");
return 1;
}
const char *drive = argv[1];
char d = drive[0];
// accept both `d` and `d:` as argument for the drive
if(!((d>='a' && d<='z') || (d>='A' && d<='Z')) ||
(drive[1]!=0 && drive[1]!=':') ||
drive[2]!=0) {
printf("Invalid drive specifier: `%s`\n", drive);
return 2;
}
char path[]="\\\\.\\X:";
path[4] = d;
// now you can use path as argument to CreateFileA
Run Code Online (Sandbox Code Playgroud)
以下是原始答案,它仍然有效,但它解决了一个完全不同的问题,与OP正在经历的实际问题无关
你不能做LPWSTR点到char *,特别是不被残酷铸造指针-铸造指针只是让编译器闭嘴,它不会改变的事实,你指向的是不是一个wchar_t字符串.如果要将char *函数传递给期望wchar_t *必须执行指向数据的实际转换的函数.
现在,您有几种可能的解决方案:
_wmain直接使用和接收命令行参数作为宽字符;std::wstring;CreateFile只是一个扩展为CreateFileA或CreateFileW取决于_UNICODE宏的宏).因此,您可以CreateFileA按原样使用并传递您的字符串.最后两个解决方案并不是很好,因为使用本地编码字符串作为命令行参数会阻止程序使用任意Unicode字符打开文件.OTOH,wchar_t几乎在所有地方都使用是非常可怕的,因为它们"感染"了应用程序中几乎每个字符串处理的角落.正确的(恕我直言)出路是在任何地方使用UTF-8,并在与操作系统交谈时动态转换; 看详情.