- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
好的,我的程序有问题。我之前提出过一个问题,但没有人真正理解我的问题,所以这次我尝试了一种新的方法。
如果你好奇这是我的问题:
My program takes arguments in the form of
char* argv[]
, and im having trouble making a pointer to whatever is onargv[1]
usingLPWSTR
, since it only point toconst wchar_t*
objects.
这是我正在尝试解决我的问题的新事物(我已经尝试了多种方法,但我需要知道如何按照我的想法去做,或者如果可能的话)
基本上,我的想法是 #define
某种函数,它接受 argv[1]
上的任何内容并定义一个 const wchar_t*
具有该值。
像这样:
#define path ((const wchar_t*)argv[1])
我不确定这是做我想做的事情的正确方法(或者即使这是可能的)...
如果您有任何更好的方法来解决我的问题,请(请)告诉我如何解决并帮助我,我已经考虑了很长时间了!
我的程序说明:
Im making a program that recieves arguments. The arguments are the name of the drives, for example "F:". It then uses the function
CreateFile
with the drive letter. If you go here , and see the first parameter of the function, i think you will see what i mean.... the problem is that for me to make a LPWSTR, i would need a const wchat_t* object.... I hope my question is clear this time, last time people didnt really understand what i was trying to do.
无论如何,谢谢!编辑 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);
}
这是带参数的(不起作用)
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
}
^ 这显示了我正在尝试做的事情
编辑 2:我将 CreateFile
更改为 CreateFileA
,这是它给我的错误代码(驱动器 D 是 USB,不是硬盘)
因此,除非我以错误的方式键入路径,否则它总是会给我错误。我想我会尝试另一种方法来解决问题,或者如果有人知道为什么会出现这些错误,请告诉我!
最佳答案
EDIT 2: i changed the CreateFile to CreateFileA , and this is the eroor codes it gives me (the drive D is a usb, its not a hard drive)
这是一个完全不同的问题,与 wchar_t
无关。
在您的第一个片段中,您通过了 "\\\\.\\F:"
(一旦我们删除了 C 转义,也称为 \\.\F:
);在您从命令行进行的所有尝试中,您从未提供过此路径,而是分别提供:
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
下面是原始答案,它仍然有效,但它解决了一个完全不同的问题,与 OP 遇到的实际问题无关
你不能让 LPWSTR
指向 char *
,尤其是不能通过粗暴地转换指针 - 转换指针只会让编译器闭嘴,它不会改变你指向的事实不是 wchar_t
字符串。如果您想将 char *
传递给需要 wchar_t *
的函数,您必须对指向的数据执行实际转换。
现在,您有几种可能的解决方案:
_wmain
并直接接收您的命令行参数作为宽字符;std::wstring
的函数中;CreateFile
只是一个扩展为 CreateFileA
或 CreateFileW
的宏,具体取决于 _UNICODE
宏)。因此,您可以使用 CreateFileA
并将您的字符串原样传递给它。最后两个解决方案不是很好,因为使用本地编码字符串作为命令行参数会阻止您的程序使用任意 Unicode 字符打开文件。 OTOH,几乎在任何地方都使用 wchar_t
是一件非常可怕的事情,因为它们几乎“感染”了应用程序的每个字符串处理角落。正确的(恕我直言)出路是在任何地方都使用 UTF-8,并在与操作系统对话时即时转换; see here for details 。
关于C++ #define LPWSTR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44584508/
我正在尝试添加 ace editor到我的应用程序。我从 github 下载它,将“ace/lib/ace”目录放到我的应用程序目录中,包括: " 在我的正文标签中: editor = ace.edi
如果有人能介绍一下 TypeScript 1.8 模块,我将不胜感激。 我有 SomeClass.ts 文件: export class SomeClass { } 然后,在我的 app.ts 中导入
今天,当我阅读php内核代码时,在目录:php5.3/Zend/Zend.h中,有一行代码让我很困惑。 代码如下: /* overloaded elements data types */ #defi
今天看php的内核代码,在php5.3/Zend/Zend.h目录下,有一行代码搞得我一头雾水。 代码如下: /* overloaded elements data types */ #define
我有一个相当大的项目,我试图将所有 JS 文件连接到一个文件中。我已经能够做到这一点,但我在实际将这两个文件实现到代码中时遇到了麻烦。 我的 Gruntfile 有一个执行串联的任务: require
1在以下示例中似乎没有必要(并且可能具有误导性),但是在用于检查 #ifdef 时我已经多次看到这种情况s: #ifndef __NEWLIB_H__ #define __NEWLIB_H__ 1 使
感谢您提供的任何帮助。我有一个 Grails 项目,我正在尝试将 Karma 安装到其中。但是,当我运行时 ./gradlew 构建 我收到以下错误: [x-10-105-56-234]SENG519
我从 Frontend Developer Interview Coding Questions 得到了这个问题.为什么下面的代码片段会打印它打印的内容?我最初认为它会抛出一个 ReferenceEr
之前的问题描述有歧义,所以我在下面修改了一些东西。谢谢。 我想像这样实现一些宏: #define AddVariable(x) \ #define x (++counter) class Ba
我知道我正试图朝自己的腿开枪 ;) 但是,它可以让我使其余(大量)代码更小且更易读。 有什么技巧可以在另一个预处理器宏中创建预处理器宏吗? 这是我正在寻找的示例。我的真实场景更复杂 // That's
在 Microsoft 的 WinDef.h 中引入了几个用于回调的#defines: #ifdef _MAC #define CALLBACK PASCAL #define WINAPI
我知道我想在腿上开枪;)但是,它可以让我使其余(大量)代码更小且更具可读性。 在另一个预处理器宏中创建预处理器宏有什么棘手的方法吗? 这是我正在寻找的示例。我的真实场景更复杂 // That's wh
当我使用这段代码时: #include #define STR(x) #x int main(void) { printf(__FILE__ STR(__LINE__) "hello!\n"
今天的问候, 您好,我是使用 vb 6.0 的初学者。我正在使用以下代码并获得“用户定义类型未定义”。代码在下面。我得到错误的行被突出显示。请帮助。我应该添加一些引用或组件吗?如果是这样,它会是什么。
当我尝试编译此代码时,在 VB6 中出现编译错误“用户定义的类型未定义”。谁能告诉我需要做什么来解决这个错误?以下是我收到错误的行: Public Conn As ADODB.Connection P
我最近将我的应用程序从 Ember 1.3 升级到了 Ember 2.4.2。然而,在使用 ember build --env production 将其部署到我的生产环境后,我注意到了一些问题。 第
这个问题在这里已经有了答案: Getting user-defined type not defined error when running code (2 个回答) 3年前关闭。 我在运行程序以通
在我的一个项目中,我最近进行了重构并重命名了很多。完成此步骤后,一切正常,所有单元测试都通过了,但是我遇到了以下问题。 当我在VBE中执行“编译”时,确实出现了“用户定义的类型未定义”错误,并出现两种
所以我的 Visual Studio 将 tag1 和 tag2 都声明为未定义,但它们的定义很清楚,我不能根据另一个定义一个吗? #define push 99 #de
在 Excel 2007 中,我有以下非常简单的 VBA 代码: Public Type specType sb As Long End Type Private Sub MyButton_C
我是一名优秀的程序员,十分优秀!