LPWSTR和char*是啥关系,这段代码求解决问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LPWSTR和char*是啥关系,这段代码求解决问题相关的知识,希望对你有一定的参考价值。

已知
#define LPTSTR LPWSTR
有段代码如下
#include <windows.h>
char szSelfName[MAX_PATH] = 0 ;
GetModuleFileName(NULL, szSelfName, MAT_PATH);
书上代码就是这样的,GetModuleFileName的第二个参数要求LPWSTR类型,下划线报错说char*和LPWSTR类型不兼容(百度百科说char*和LPWSTR就是同样的类型,纠结~),于是我把代码第二行改成LPWSTR szSelfName;但是到后来要求把szSelfName和一个字符串(const char)拼接,LPTSTR是指针类型,不能用运算符直接拼接,strcat也不行,网上找到个方法说是把szSelfName强制转换为string,也就是string(szSelfName),结果这样又提示string没有对应类型的构造函数。
问题就是需要这个类型,既要能够做GetModuleFileName的第二个参数(LPWSTR类型)又能和一个const char类型的字符串拼接,求解决
PS:书上的例程是VC6.0的,我的开发环境是VS2012,好像C++对数据类型的要求越来越严格了

这是UNICODE的问题, vc里项目“属性-》常规-》字符集”这个选项控制是使用unicode还是多字节, unicode对应的就是LPWSTR, 16位, 多字节就是char, 8位。 LPWSTR的最终宣告是unsigned short, 可见是16位的。MFC里有一个很容易的unicode转ansi的宏, USES_CONVERSION, 通过W2A就可以把LPWSTR转换为char* 参考技术A

这里你有一个误区,注意看下面代码(VC标准源文件代码):

#ifdef UNICODE
typedef WCHAR TCHAR
#define GetModuleFileName  GetModuleFileNameW
#else
typedef char TCHAR
#define GetModuleFileName  GetModuleFileNameA
#endif // !UNICODE

包括LPTSTR  TCHAR等都是这样定义的,字符串的T字头,就是自适应UNICODE。

这样就推荐在程序中,使用T字头,而不要使用char LPSTR,也不要使用UNICODE的WCHAR LPWSTR,这样的程序没有编码适应性。

因此你的程序,char的声明修改一下就可以了:

TCHAR szSelfName[MAX_PATH] = _T("");

 这样,无论是UNICODE编码模式(2012默认)还是ANSI编码模式(VC6默认)都可以无误编译运行。

js问题,动态增加select里的option,求问为啥这段代码不执行?求大神指教!

<script>

// 动态添加select中的项option:
function addOneOption()

var optionlist = new Array();
<%
String[] arrlist = (String[]) request.getAttribute("optionlist"); //调用servlet传来的数组
if(null != arrlist)

for(int i = 0; i < arrlist.length; i++)

%> optionlist[<%=i%>]=<%=arrlist[i]%>;
<%


%>
var selectObj=document.getElementById("user_dm");
var option = document.createElement("option");
for(var t = 0 ;t < optionlist.length;t++)

option.value=optionlist[t];
option.innerHTML = t;
selectObj.appendChild(option);

</script>

====================================
<body>
<select id="user_dm" name="user_dm">
</select><br>
<input type="button" onClick="addOneOption()" value="添加">
</body>

本来添加单个option就行的,加了上面那段java代码就不执行了。

java  代码 是后台执行 , 在前台 是无法执行的 , 

如果要从后台获取数据  要使用ajax的方式  在回调函数里面增加选项

function addOneOption()
$ajax(
    url:url,
    success:function(data)
     var optionlist = eval(\'(\' +data + \')\');
     var selectObj=document.getElementById("user_dm");
    var option = document.createElement("option");
    for(var t = 0 ;t < optionlist.length;t++)
     
        option.value=optionlist[t];
        option.innerHTML = t;
        selectObj.appendChild(option);
    
    ,
);
var selectObj=document.getElementById("user_dm");
var option = document.createElement("option");
for(var t = 0 ;t < optionlist.length;t++)
 
option.value=optionlist[t];
option.innerHTML = t;
selectObj.appendChild(option);

</script>

====================================
<body>
<select id="user_dm" name="user_dm">
</select><br>
<input type="button" onClick="addOneOption()" value="添加">
</body>
参考技术A 写的什么乱七八糟的,自己右键查看源文件,看看生成的什么东西再说追问

上面java代码单独拿出来能成功执行,optionlist能获取一个数组。下面的js代码如果删掉上面的java也能成功执行,动态增加select的子项option,加在一起就不成功了。我就是要把数组里的值作为新增option的值

以上是关于LPWSTR和char*是啥关系,这段代码求解决问题的主要内容,如果未能解决你的问题,请参考以下文章

“char *”类型的参数与“LPWSTR”类型的参数不兼容

将LPWSTR转换为char * / string

如何在 vc++ 中将 char* 转换为 LPWSTR..........................? [复制]

怎么把char型数组转换为lpwstr

如何在 VC++ 中将 char* 转换为 LPWSTR?

AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为啥?