VC+AO

发布时间 : 星期一 文章VC+AO更新完毕开始阅读

字符串函数转换也不能达到显示文字的目的,因为此时调用得API函数是用ANSI的(虽然底层都是用UNICODE处理但是处理结果是按照程序员调用的API来显示的)。所以必须用unicode来开发。

9 VC++2005 CString和char*的相互转换

首先声明我不是一个高手,而是一个初学者,文章同样也是一个初学者对于CString和char*转换的理解。

因为需要,接触C++一段时间了,其中最为困扰我的问题就是在使用C++的过程中CString和char*的转换,在网上搜索了一下,看到问这个问题的人挺多的。我使用的平台是Win2003+VC 2005,本来这个很简单的问题稍微复杂了一点在2005里面。

在我的工程里面要集成一个用C开发的程序,用VC做windows窗体的界面,在C的函数中有不少是使用char*作为参数的,因此有一个必不可少的步骤就是把CString转换为shar*字符串。

作为一个初学者,遇到这个问题,首先是在baidu上搜索了一下转换的方法,有很多结果,别人也说有效,但是我把它放在我的代码里面的时候,就是出现错误。下面是我的解决办法。 使用CString的GetBuffer方法 CString origCString(\

char* CharString = origCString.GetBuffer(origCString.GetLength()+1); 网上的很多文章说的都是这个方法,但是我在VC++2005中编译得到下列信息 Error 1 error C2440: 'initializing' : cannot convert from 'wchar_t *' to 'char *' 对于这个错误不是很理解,因为是刚开始使用VC不久,所以对于wchar_t和char的区别不是很清楚,在MSDN中查看了一下,wchar_t是一个宽字符型,相当于unsigned short(16bit)。而我们通常使用的char是8bit。继续搜索wchar_t*到char*的转换,msdn上面有一篇文章是Convert Between Various String Types,讲了VC++2005中的各种字符串char *, wchar_t*, _bstr_t, CComBSTR, CString, basic_string, and System.String的相互转换。其中将wchar_t*转换为char*的代码如下:(为了保持文章的一致性,修改了变量名)

#include #include using namespace std; int main() {

wchar_t *origString = L\ wcout << origString << endl;

// Convert to a char*

size_t origsize = wcslen(origString) + 1; const size_t newsize = 100; size_t convertedChars = 0; char CharString[newsize];

wcstombs_s(&convertedChars, CharString, origsize, origString , _TRUNCATE); cout << CharString << endl; }

输出正确,均为Hello, World!

结合上面的两段,看看能不能将CString转换为char* CString origCString(\

wchar_t* wCharString = origCString.GetBuffer(origCString.GetLength()+1); size_t origsize = wcslen(wCharString) + 1; size_t convertedChars = 0; char *CharString;

CharString=new char(origsize);

wcstombs_s(&convertedChars, CharString, origsize, wCharString , _TRUNCATE); cout << CharString << endl; 成功输出字符串\

至于为什么原来的那段代码别人都能用好,而我在VC++2005下面去不能直接使用,还要通过转换呢?正好看到《Programming Windows》的第二章讲Unicode的和在msdn论坛问了一下相关问题后得到答案。

原来在VC++ 2005以前,应用程序默认都是关闭对Unicode的支持的,而在VC2005中,默认打开了对它的支持,CString对应的字符串应该是TCHAR,TCHAR的定义是这样的, #ifdef _UNICODE

typedef wchar_t TCHAR ; #else

typedef char TCHAR; #endif

我想这个就是为什么我在VC++2005种不能直接转换的原因。在工程中应该可以关闭对于Unicode的支持,从而可以直接转换。这个做法是右击工程名—〉Property—〉General中的character set中选择not set,这样,本文开头的那段代码就可以正确的执行了。

10 简述MFC程序生与死

经常从网上下载好程序,但打开VC看了不到几行,鼠标就移到最到最右上角,对准那个“X”,咔嚓...(心还暗念:嚓死你!),二话不说在“程序”菜单里 寻找QQ的存在,开始进入休闲时光!!这可是我经常做的事情,唉!苦于基础不扎实,经常被美好的代码踢出门外。但幸好我还对她有一斯感觉,近来有幸买到侯 先生的《深入浅出MFC》,看到第六章:MFC程序的生死因果,觉得是学MFC,喔不,应该是看MFC程序代码的好起点,该章对MFC程序(没有支持 Document/View)的生死因果做也详细的讲解,为了加深记忆,我总结了以下流程,供大家参考。

MFC程序的启动与死亡顺序:

1、创建Application object对象theApp

程序一开始生产一个(且只有一个)Application object对象theApp,也即一个CWinApp对象,这个全局对象一产生,便执行其构造函数,因为并没有定义CMyWinApp构造函数,所以即 执行CWinApp类的构造函数。该函数定义于APPCORE.CPP第75行,你可以自己搜出来啃一啃,因此,CWinApp之中的成员变量将因为 theApp这个全局对象的诞生而获得配置与初值。

2、WinMain登场

用SDK编程序时,程序的入口点是WinMain函数,而在MFC程序里我们并没有看到WinMain函数,哦!~ 原来她是被隐藏在MFC代码里面了。当theApp配置完成后,WinMain登场,慢!细看程序,并没连到WinMain函数的代码啊!这个我也不知 道,MFC早已准备好并由链接器直接加到应用程序代码中了,原来她在APPMODUL.CPP里面,好,我们就认为当theApp配置完成后,程序就转到 APPMODUL.CPP来了。那执行什么呢?看看下面从APPMODUL.CPP摘出来的代码: extern \

_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {

// call shared/exported WinMain

return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); }

_tWinMain函数的“_t”是为了支持Unicode而准备的一个宏。

_tWinMain函数返回值是AfxWinMain函数的返回值,AfxWinMain函数定义于WINMAIN.CPP第21行,稍加整理,去芜存菁,就可以看到这个“程序进入点”主要做些什么事:

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {

int nReturnCode = -1;

CWinApp* pApp = AfxGetApp();

AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow); pApp->InitApplication(); pApp->InitInstance()

nReturnCode = pApp->Run();

联系合同范文客服:xxxxx#qq.com(#替换为@)