使用c++的windows编程中一个string对象内容为"默认字符串",如何转换为TCHAR数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用c++的windows编程中一个string对象内容为"默认字符串",如何转换为TCHAR数组相关的知识,希望对你有一定的参考价值。

使用c++的windows编程中一个string对象内容为"默认字符串",如何转换为TCHAR数组TCHAR Buffer[size]最后用textout输出到窗口客户区,请给出代码过程

首先说说变量。 c/c++在windows编程中,默认的字符串指针是以 sz 开头的,意为string zero,因为char指针,遇到\\0则会结束。 szDSN 是 data source name,即你在管理工具中数据源里面设置的数据源名称,是字符串。 szUID 则是用户名,ms sql server默认登录名是 sa szAuthStr 看到登录名,不用说这个也就是密码了,密码为wang 接着,就是重点了。 retcode=SQLConnect( hdbc1,(SQLCHAR*)szDSN,(SWORD)strlen(szDSN), (SQLCHAR*)szUID, (SWORD)strlen(szUID), (SQLCHAR*)szAuthStr, (SWORD)strlen(szAuthStr) ); 这句我们还是拆开了,两个变量两个变量这样来说,不容易混淆。 首先第一行,hdbc1,这是一个句柄,一般的,windows编程中h开头的变量都表示句柄(除非是有意义的单词),这是MS某个员工使用的习惯,后来被普遍使用的匈牙利命名法。 句柄,我们简单理解,就是一个指向某个东西的一个号码,或者ID。有了这个句柄,我们才能定位我们是在使用哪个SQL连接器。 所以我们这里是使用后续的变量,创建一个SQLConnector,然后将该Connector的句柄赋给hdbc1,方便我们后续操作。 (SQLCHAR*)szDSN 其实 SQLCHAR 等同于 char,只是为了规范,将其转换成这样罢了,对应的值还是上述的数据源名称 szDSN。 (SWORD)strlen(szDSN),因为C/C++中,我们很难确定一个字符串的长度,所以我们这里要告诉这个连接器,我们的数据源的那个字符串究竟有多长,它也就会取多长。strlen是求字符串长度。(SWORD)同样是转换,也是一个int值,只不过改了个名字罢了。 接着就是设置用户名 UID 啦,同样需要求长度,再接着是密码 AuthStr ,依旧需要求长度。 这样就6个变量都完了。最终会把该函数的执行结果赋给retcode,返回的结果是一个状态码,是头文件预先设定好的,这个可以不用管,但我们需要知道,只要值 <0 ,就是有错误的 后面的if就是判断这个状态,假如 <0 ,则上面的SQLConnector创建失败,在控制台输出错误提示,并返回-1 结束该函数。 参考技术A std::string str="something";
TCHAR *param=new TCHAR[str.size()+1];
param[str.size()]=0;
//As much as we'd love to, we can't use memcpy() because
//sizeof(TCHAR)==sizeof(char) may not be true:
std::copy(str.begin(),str.end(),param);

追问

你这个带汉字不行了,如何处理比如 ab玻璃c 这样的string

参考技术B 你的项目应该是Unicode编码,否则直接string.c_str()就行了。
Unicode下string转换为TCHAR:
wchar_t* char2wchar_t(char* cstr)
int len = MultiByteToWideChar(CP_ACP,0,cstr,strlen(cstr),NULL,0);

wstr = new wchar_t[len+1];

MultiByteToWideChar(CP_ACP,0,cstr,strlen(cstr),wstr,len);

wstr[len] = '\0';

return wstr;

delete wstr;


TCHAR* 结果=char2wchar_t(string.c_str());
参考技术C std::copy(str.begin(), str.end(), w_str.begin());
str是普通string;
w_str是 w_char string;
你要带汉字,就不能直接用string, 除非你去背编码, 或者习惯看各种乱码
简单的方式是 L“abc测试”, 自动装箱成wstring

无法在 Windows 中以编程方式 (C++) 从其他用户帐户读取文件

【中文标题】无法在 Windows 中以编程方式 (C++) 从其他用户帐户读取文件【英文标题】:Unable to read file from other user account programmatically (C++) in Windows 【发布时间】:2012-06-28 14:30:42 【问题描述】:

我使用以下功能在 Windows 的一个用户帐户中创建了一个包含一些日志的文本文件:

WORD wBOM = 0xFEFF;

    HANDLE hFile = ::CreateFileW(filePath, GENERIC_WRITE, 0, NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL, NULL);

            ::WriteFile(hFile, &wBOM, sizeof(WORD), &NumberOfBytesWritten, NULL);
            ::CloseHandle(hFile); 

现在,当我以编程方式从其他用户帐户读取此文件时,我无法打开文件并读取其内容。

我正在使用以下功能从其他用户帐户读取数据。

CFile file;
        CFileException *exp = NULL;
        if(!file.Open( logAppExecPath,CFile::modeReadWrite | CFile::shareDenyNone,exp))
        

        if(exp != NULL)
        
            TCHAR ErrorMsg[MAX_PATH];
            exp->GetErrorMessage(ErrorMsg,MAX_PATH);
            AfxMessageBox(L"XML Creation while AppExecLogs : "+ CString(ErrorMsg));
            exp->Delete();

        
        

但是,每当我从同一个用户帐户读取时,上述功能都可以正常工作并正确打开和读取文件。

两个用户帐户都是管理员帐户。

总之,以编程方式在一个用户帐户中写入文件并从其他用户帐户读取会出现“文件不存在”的异常......但事实是文件存在,我可以使用单击手动打开该文件。

【问题讨论】:

你确定你有它的权利吗?因为听起来好像你没有。 你好@RedX ...感谢您的回复...事实上我又做了一项测试,我在有限帐户中创建了文件并尝试在管理员帐户中读取它...但这次也它失败了......但在有限帐户中,我可以使用 CFile() 打开文件 @JoãoAugusto :文件路径为:C:\ProgramData\Limited_User\logs.txt 【参考方案1】:

默认情况下,用户的个人资料只有该用户可以访问。此外,Windows 没有标准方式来访问任何其他用户的配置文件。

您最好的选择是使用公共/共享位置,在C:\ProgramData\(根据需要设置权限)或公共文档文件夹中。取决于文件是什么。

【讨论】:

以上是关于使用c++的windows编程中一个string对象内容为"默认字符串",如何转换为TCHAR数组的主要内容,如果未能解决你的问题,请参考以下文章

标准C++中string类的用法总结

WIndows编程之线程池的使用

标准C++中的string类的用法总结

以编程方式检查 Windows 是不是已使用 C++ 激活

C#中string类型是啥类型

在 Windows 中编程 C 或 C++ 时如何操作 GUID?