了解定义的"类型"_马鸿凯_新浪博客

作为经常死在类型转换上的路人,烦了,厌了,就打算整顺这玩意。(针对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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma_Hong_Kai

微信 2936729162

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值