Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CPP Windows字符串转换CStringA和LPCWSTR_C++_String_Windows - Fatal编程技术网

C++ CPP Windows字符串转换CStringA和LPCWSTR

C++ CPP Windows字符串转换CStringA和LPCWSTR,c++,string,windows,C++,String,Windows,我需要使用WINAPI函数重新启动Windows服务,我不熟悉C++中的字符串。 我的函数接收为参数:const CStringA&serviceName: 当我通过OpenService获得SC句柄时。。我需要提供LPCWSTR类型: 如何将CStringA转换为LPCWSTR 我试图做到以下几点: CA2WserviceName,CP_UTF8; CString strmyservice名称;CStringW-strwstr;LPCWSTR ptr=strw; 两者都不能正常工作,它们编译了

我需要使用WINAPI函数重新启动Windows服务,我不熟悉C++中的字符串。 我的函数接收为参数:const CStringA&serviceName:

当我通过OpenService获得SC句柄时。。我需要提供LPCWSTR类型:

如何将CStringA转换为LPCWSTR

我试图做到以下几点:

CA2WserviceName,CP_UTF8; CString strmyservice名称;CStringW-strwstr;LPCWSTR ptr=strw; 两者都不能正常工作,它们编译了,但当我试图执行代码时。 它无法打开服务。 工作内容:

LPCWSTR newString=serviceName.AllocSysString; 我错过了什么?为什么1和2不起作用?为什么3起作用

如何正确解除分配新闻字符串?

CStringA和CStringW的构造函数同时使用const char*和const wchar\u t*C字符串

写下:

CStringW serviceNameW( serviceName );
关于AllocSysString,它在BSTR中创建一个副本,它们比C字符串更复杂,它们也以null结尾,但它们的长度也为负偏移量。如果要进行手动内存管理,请在指针上调用SysFreeString。或者,如果需要BSTR但不需要手动内存管理,请使用CComBSTR类。

CStringA和CStringW的构造函数同时使用const char*和const wchar\u t*C字符串

写下:

CStringW serviceNameW( serviceName );

关于AllocSysString,它在BSTR中创建一个副本,它们比C字符串更复杂,它们也以null结尾,但它们的长度也为负偏移量。如果要进行手动内存管理,请在指针上调用SysFreeString。或者,如果您需要BSTR但不需要手动内存管理,请使用CComBSTR类。

您的代码需要转换,因为您正在调用基于TCHAR的OpenService宏,该宏映射到OpenServiceW或OpenServiceA,具体取决于是否定义了UNICODE:

__退票 WINADVAPI 柄 WINAPI OpenServiceA __在SC_HANDLE hSCManager中, __在LPCSTR lpServiceName中, __德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德 ; __退票 WINADVAPI 柄 WINAPI OpenServiceW __在SC_HANDLE hSCManager中, __在LPCWSTR lpServiceName中, __德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德 ; ifdef UNICODE 定义OpenService OpenServiceW 其他的 定义OpenService OpenServiceA endif/!统一码 在您的例子中,UNICODE显然是在您的项目中定义的,因此您的代码实际上是在调用OpenServiceW,这就是为什么它需要一个LPCWSTR作为输入

RestartServer方法将基于CStringA字符的ANSI字符串作为输入,因此应显式使用OpenServiceA匹配相同的字符类型,无需转换:

bool MyClassName::RestartServerconst CStringA&serviceName { ... SC_HANDLE SHandle=OpenServiceAhSCManager,serviceName,SC_MANAGER\u ALL\u ACCESS; ... } 否则,如果要在代码1中继续使用基于TCHAR的功能,则应将RestartServer方法更改为采用CString而不是CStringA,以便它采用与OpenService和其他基于TCHAR的功能相同的ANSI/Unicode映射,再次避免转换:

1:你不应该这样做,因为现在很少需要为Win9x/ME编写代码。自NT4以来,Windows一直是基于Unicode的操作系统

bool MyClassName::RestartServerconst CString和serviceName 如果这不是您的选择,那么CA2W可以正常工作:

bool MyClassName::RestartServerconst CStringA&serviceName { 使用_转换; ... SC_HANDLE SHandle=OpenServicehSCManager,ATL::CA2WserviceName,SC_MANAGER_ALL_ACCESS; ... }

尽管如此,您可以考虑仅在内部使用cStand,如果需要的话,让它处理转换:

bool MyClassName::RestartServerconst CStringA&serviceName { ... SC_HANDLE SHandle=openserviceshscmanager、CStringserviceName、SC_MANAGER\u ALL\u ACCESS; ... } 或者,使代码有条件:

bool MyClassName::RestartServerconst CStringA&serviceName { ... SC_HANDLE SHandle=OpenServicehSCManager, ifdef UNICODE CStringWserviceName 其他的 服务名 恩迪夫 ,SC_经理_所有访问权限; ... }
您的代码需要转换,因为您正在调用基于TCHAR的OpenService宏,该宏映射到OpenServiceW或OpenServiceA,具体取决于是否定义了UNICODE:

__退票 WINADVAPI 柄 WINAPI OpenServiceA __在SC_HANDLE hSCManager中, __在LPCSTR lpServiceName中, __德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德 ; __退票 WINADVAPI 柄 WINAPI OpenServiceW __在SC_HANDLE hSCManager中, __在LPCWSTR lpServiceName中, __德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德·德沃德 ; ifdef UNICODE 定义O penService OpenServiceW 其他的 定义OpenService OpenServiceA endif/!统一码 在您的例子中,UNICODE显然是在您的项目中定义的,因此您的代码实际上是在调用OpenServiceW,这就是为什么它需要一个LPCWSTR作为输入

RestartServer方法将基于CStringA字符的ANSI字符串作为输入,因此应显式使用OpenServiceA匹配相同的字符类型,无需转换:

bool MyClassName::RestartServerconst CStringA&serviceName { ... SC_HANDLE SHandle=OpenServiceAhSCManager,serviceName,SC_MANAGER\u ALL\u ACCESS; ... } 否则,如果要在代码1中继续使用基于TCHAR的功能,则应将RestartServer方法更改为采用CString而不是CStringA,以便它采用与OpenService和其他基于TCHAR的功能相同的ANSI/Unicode映射,再次避免转换:

1:你不应该这样做,因为现在很少需要为Win9x/ME编写代码。自NT4以来,Windows一直是基于Unicode的操作系统

bool MyClassName::RestartServerconst CString和serviceName 如果这不是您的选择,那么CA2W可以正常工作:

bool MyClassName::RestartServerconst CStringA&serviceName { 使用_转换; ... SC_HANDLE SHandle=OpenServicehSCManager,ATL::CA2WserviceName,SC_MANAGER_ALL_ACCESS; ... }

尽管如此,您可以考虑仅在内部使用cStand,如果需要的话,让它处理转换:

bool MyClassName::RestartServerconst CStringA&serviceName { ... SC_HANDLE SHandle=openserviceshscmanager、CStringserviceName、SC_MANAGER\u ALL\u ACCESS; ... } 或者,使代码有条件:

bool MyClassName::RestartServerconst CStringA&serviceName { ... SC_HANDLE SHandle=OpenServicehSCManager, ifdef UNICODE CStringWserviceName 其他的 服务名 恩迪夫 ,SC_经理_所有访问权限; ... }
您不应该指定CStringA。您应该使用CString,它将根据编译器设置选择A或W版本,就像您没有指定OpenServiceW一样。感谢您的提示,我将CStringA作为一个选项卡接收,我无法更改。您不应该指定CStringA。您应该使用CString,它将根据编译器设置选择A或W版本,就像您没有指定OpenServiceW一样。感谢您的提示,我将CString作为一个禁忌接收到,我可以更改它。很好的答案-这正是我想要的,可以从高层次了解正在发生的事情。问题是,我无法改变CStringA,因此需要cast。很好的答案——正是我想要的,能够从更高的层次了解正在发生的事情。问题是,我得到CStringA作为一个事实,我不能改变,所以强制转换是必需的。
CStringW serviceNameW( serviceName );