作为经常死在类型转换上的路人,烦了,厌了,就打算整顺这玩意。(针对VC)
1、我们定义的是类还是,数据类型?
2、定义的数据类型是什么编码?(别给我说是unicode)
先来说第一个:
我们经常会遇到类似与CString、string、wstring、char *(char str[]后面就不写这个了,也就是
CHAR),wchar_t *、WCHAR *、LPCTSTR 等等。(F12可以看到最根本的数据类型差不多就是char、
WCHAR、wchar_t 这三种)
那么我们明确下我们到底要转的是什么,转到的类型到底是啥?
转的是一个“类”还是数据类型,你要转的目标是类还是数据类型。
string(链接是百度百科)
但是string的定义不认为是对的,我认为是个容器,本质就是一个设计好的类。而我们要转的是里面的是类
里面的字符串(char *)。
std::string str (
"Please split this sentence into tokens"
);
char
* cstr =
new
char
[str.length()+1];
std::strcpy (cstr, str.c_str()) ;
……
delete[] cstr;
wstring百度百科上没有了,不误人子弟了。
其实点击链接就可以差不多明白了。我在这小结下。
wstring 就是以wchar_t
作为字符类型,其余的和string差不多。
CString(链接是百度百科)
F12 MFC atlstr.h
1111 行开始
我们可以看到(先看下面)
#ifndef _ATL_CSTRING_NO_CRT
typedef CStringT< wchar_t, StrTraitATL< wchar_t, ChTraitsCRT< wchar_t > > > CAtlStringW;
typedef CStringT< char, StrTraitATL< char, ChTraitsCRT< char > > > CAtlStringA;
typedef CStringT< TCHAR, StrTraitATL< TCHAR, ChTraitsCRT< TCHAR > > > CAtlString;
#else // _ATL_CSTRING_NO_CRT
typedef CStringT< wchar_t, StrTraitATL< wchar_t > > CAtlStringW;
typedef CStringT< char, StrTraitATL< char > > CAtlStringA;
typedef CStringT< TCHAR, StrTraitATL< TCHAR > > CAtlString;
#endif // _ATL_CSTRING_NO_CRT
#ifndef _AFX
typedef CAtlStringW CStringW;
typedef CAtlStringA CStringA;
typedef CAtlString CString;
#endif
CStringT 再次F12 转到 cstringt.h
看到这里是不是似曾相识燕归来的感觉。
先看个
list容器的实现 , 为啥要看这个。仔细瞅瞅就会发现,其实这玩意就是个 容器 。或者说是“
封装好
的重
载的类”。首先是个类,其实和重载的函数,说是封装,因为你除非重写,不然就只能直接用了。
接下里看下不同的参数。三个数据类型分别是:wchar_t、char、TCHAR。前面个两个好理解,但是第三个是啥,别急,我给你个它的另一个写法WCHAR(wchar_t)
-----这个稍后补充
先来个转码附带获取路径的:
// 亲测可用第二个路径待定
DWORD ThreadProcLenDin( LPVOID lpParameter)
{
HMODULE hModule = (HMODULE)lpParameter;
OutputDebugStringA("ThreadProcLenDin start\n");
wchar_t pBuf[MAX_PATH] = {0};
OutputDebugStringA("GetCurrentDirectory before\n");
if(GetCurrentDirectoryW(MAX_PATH,pBuf) <= 0)
{
CString strErr;
strErr.Format(_T("---- GetCurrentDirectory errcode = %d "),GetLastError());
OutputDebugString(strErr);
}
OutputDebugStringA("GetCurrentDirectory out\n");
{
OutputDebugStringA("pBuf1 = ");
OutputDebugStringA("\n");
OutputDebugStringW(pBuf);
}
wstring strBuf(pBuf);
#ifdef _WIN64
wstring ppcs(L"\\XX64.dll");
strBuf.append(ppcs);
#else
wstring ppcs(L"\\XX.dll");
strBuf.append(ppcs);
#endif
{
OutputDebugStringA("pBuf2 = ");
OutputDebugStringW(pBuf);
OutputDebugStringA("\n");
}
HMODULE hOleaut32 = LoadLibrary(strBuf.c_str());
while(!hOleaut32)
{
hOleaut32 = LoadLibrary(strBuf.c_str());
CString strErr;
strErr.Format(_T("---- ThreadProcLenDin LoadLibrary errcode = %d "),GetLastError());
OutputDebugString(strErr);
Sleep(3000);
}
FreeModule(hModule);
return 0;
}