dotner Framwork 版本概述

dotner Framwork 版本概述
===========================================================
.NET 3.0=.NET 2.0 Service Pack 1 with WCF, WPF, WF and WCS
.NET 3.5=.NET 2.0 Service Pack 2 with LINQ, C# 3.0, WCF 2.0, WPF 2.0, WF 2.0 and ASP.NET Ajax

guan98413 发表于:2007.11.23 09:46 ::分类: ( C# ) ::阅读:(292次) :: 评论 (10) :: 引用 (0)
===========================================================
ATM软件分类
===========================================================

ATM软件主要有:
ATMC C是指Client端的软件,安装在ATM机器(设备)上的软件。
ATMP P是指平台(Platform),安装在银行的运行中心(机房),主要负责ATM交易的转发等功能
ATMV V是指监控View/Monitor,正如2楼所说的从ATMP和ATMC获取数据,实现对自助设备的有效管理和实时监控。
ATMA A是指分析Analysis,交易分析、业务分析,很多银行在ATMV中实现的部份的ATMA功能


guan98413 发表于:2007.11.08 09:17 ::分类: ( 一般分类 ) ::阅读:(223次) :: 评论 (0) :: 引用 (0)
===========================================================
Sandcastle Help File Builder使用注意事项
===========================================================

Sandcastle Help File Builder在vs2005中xml注释生成程序说明文档的过程中很方便,以前大部分都使

用NDoc,可NDoc不支持dotnet2.0(据说主要开发人员已经宣布不再维护),在dotnet2.0下我们可以使用

microsoft的Sandcastle来生成document。Sandcastle主要是基于console的,命令有点复杂,不大适合初

学者使用,幸好有Sandcastle Help File Builder图形化的文挡生成工具,使使用者减轻了好多工作。
在使用Sandcastle Help File Builder中有一些细节需要注意:
(1)使用Sandcastle Help File Builder之前需要确认已经安装Sandcastle和HTML Help Workshop
(2)HTML Help Workshop的安装路径最好是程序默认安装路径,笔者就曾因为自定义了安装了路径导致

在使用Sandcastle Help File Builder的时候出了一些错误,特别是生成windows form程序的文档的时候


(3)设置Sandcastle Help File Builder Paths选项下的一些设置:
比如HtmpHelp1xComplierPath, outputPath, SandcastlePath等
注:Sandcastle,HTML Help Workshop,Sandcastle Help File Builder下载地址请通过google搜索最新下载地址。

HTML Help Workshop默认安装路径应该是C:Program FilesHTML Help Workshop

使用Sandcastle Help File Builder过程中如有什么疑问,请留言。笔者尽量给予解答。


guan98413 发表于:2007.11.07 14:49 ::分类: ( 一般分类 ) ::阅读:(251次) :: 评论 (2) :: 引用 (0)
===========================================================
软件设计中很经典的一句话
===========================================================

前两天在网络上无意中看到一句话,对于软件设计可以说是很经典的.
一个维护性良好的系统应该遵循“开闭原则",即:封闭对原来代码的修改,开放对原来代码的扩展。

希望各位做软件开发,特别是大型软件设计的朋友有用.如果做过大型的设计,应该对这句话深有体会.
朋友,仔细品品这句话吧,或许你会受益非浅!


guan98413 发表于:2007.10.22 11:35 ::分类: ( 一般分类 ) ::阅读:(68次) :: 评论 (0) :: 引用 (0)
===========================================================
Visual Studio 2005常用插件搜罗(转载)
===========================================================
Visual Studio 2005 为我们带来了新的编程体验,提供了从需求分析到最终测试整个软件生命开发周期的解决方案。 但是,我们也可以看到一直以来围绕着Visual Studio有许多各种功能的插件,或是为Visual Studio 增加了新的功能或者对原有功能进行了优化,已经成为开发者不可缺少的工具。Visual Studio 2005 刚刚发布不久,所以本期我们精心挑选了在 Visual Stuio2003 中经典的同时已经升级到对Visual Studio 2005 支持的插件,也欢迎大家投稿给我推荐你喜欢的插件。我们会不断的更新,希望可以搜罗到最好最全的Visual Studio 插件.最后记得常回来看看,也许会有新的发现。。。。。。

插件名称:Reflector.FileDisassembler

插件作者:Lutz Roeder

最新版本:Reflector.FileDisassembler 4.1.85.0

发布日期: 2005-10-23

插件简介: Reflector.FileDisassembler,它是一个类浏览器和反编译器,可以分析程序集并向你展示它的所有秘密。Reflector.FileDisassembler,你可以浏览程序集的类和方法,可以分析由这些类和方法生成的 Microsoft 中间语言 (MSIL)等.

插件名称:CodeSmith

插件作者:Eric J. Smith

最新版本:CodeSmith 3.1

发布日期:2005-8-11

点击此处下载

插件简介: CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其它许多代码生成工具不同,CodeSmith 不要求你订阅特定的应用程序设计或体系结构。借助 CodeSmith 可以生成包括简单的强类型集合和完整应用程序在内的任何东西。

插件名称:NDoc

插件作者:SourceForge

最新版本:NDoc 1.3.1

发布日期:2005-1-25

点击此处下载

插件简介: 编写代码文档资料几乎总是一项令人畏惧的任务。NDoc 工具能够使用反射来分析程序集,并使用从 C# XML 注释生成的 XML 自动为代码生成文档资料,新版本提供了更多语言的支持。

 

插件名称:NUnit

插件作者:Michael C. Two, Charlie Poole 等

最新版本:NUnit version 2.2.3

发布日期:2005-11-15

点击此处下载

插件简介: NUnit 是为 .NET 框架生成的开放源代码单元测试框架。NUnit 使你可以用你喜欢的语言编写测试,从而测试应用程序的特定功能。

 

插件名称:FxCop

插件作者:Microsoft

最新版本:FxCop 1.32

发布日期:2005-7-25

点击此处下载

插件简介:.NET 框架非常强大,这意味极有可能创建优秀的应用程序,但也同样存在创建劣质程序的可能。FxCop 是有助于创建更好的应用程序的工具之一,通过分析程序集,并使用许多不同的规则来检查它是否符合这些规则。

 

插件名称:NAnt

插件作者:Gerry Shaw ,Ian MacLean,Scott 等

最新版本:NAnt 0.85 (.net2.0beta)

发布日期:2005-04-18

点击此处下载

插件简介:NAnt 是一个基于 .NET 的生成工具,它使得为你的项目创建生成过程变得非常容易。NAnt 使你可以生成解决方案、复制文件、运行 NUnit 测试、发送电子邮件,等等。

 

插件名称:GhostDoc

插件作者:Roland Weigelt

最新版本:GhostDoc 1.9.1

发布日期:2005-11-20

点击此处下载

插件简介:GhostDoc 是一个基于Visual Studio的 XML 文档注释生成器,相比 NDoc 而言它更可以帮助你自动生成大量令人厌烦的相似的描述。

 

插件名称:Vault

插件作者:sourcegear

最新版本:Vault 3.1.5

发布日期:2005-11-04

点击此处下载

插件简介:一个基于.net平台的可以替代VSS版本控制工具采用XML Web Services作为通信协议.

 

插件名称:Dragnet

插件作者:sourcegear

最新版本:Dragnet 1.0.5

发布日期:2005-11-20

点击此处下载

插件简介:ourceGear Dragnet 是在一个事务(任务)分配和跟踪的工具。


注:此篇文章转载自http://blog.csdn.net/CQP/archive/2005/12/08/546761.aspx

guan98413 发表于:2007.10.10 09:24 ::分类: ( C# ) ::阅读:(316次) :: 评论 (4) :: 引用 (0)
===========================================================
如何开发一个visual-style界面?
===========================================================

最近项目中要开发一个工具,也可以说是一个开发工具的工具吧,类似于visual studio2005的一个东西,接到任务以后觉得很是迷茫,看了好多资料,可现在还是一头雾水.
开发visual-style的东西,不可避免的要用到docking技术,在docking选择上却有点犹豫不决,使用c#自己去实现,采用dotnetmagic,还是选择使用dotnetbar?首先使用c#自己去实现一开始就被否决,如果什么都要自己从头来开发的话最终可能什么都做不出来.选择dotnetmagic?目前使用dotnetmagic还要自己写好多代码才能实现,有点麻烦,可文档还算是比较全面,借助文档和dotnetmagic提供的samples应该可以很快上手.dotnetbar?dotnetbar是很有名的ui设计控件,业界评价很高,可文档有点欠缺,tutorials也是一些很短视频,再有一些dotnetbar提供的samples,这一控件的优点是封状性很好,使用者所需要写的代码可能比较少.
综合考虑,准备先使用dotnetbar,先花一些时间去研究那些samples.
国内这方面的资料或者可以说教程太少了,也没有人来交流一下,如果有时间的话,我准备把自己使用的一些体会写出来,希望各位朋友多多交流.


guan98413 发表于:2007.09.28 15:28 ::分类: ( C# ) ::阅读:(56次) :: 评论 (0) :: 引用 (0)
===========================================================
获取BSTR的内容
===========================================================

获取BSTR的内容
在写COM组件时经常使用BSTR的数据类型,众所周知,BSTR使用的是unicode编码,而程序中一般使用的是

ansi编码,这就需要做一步转换,究竟怎么转换才是正确的呢?
有人提倡使用WideCharToMultiByte,但测试中发现对于0x00--0x80之间的数据都能正常转换,但大于

0x80的数据做转换时就会出错。
现将项目中的一段代码摘录出来,希望能对做这方面工作的人有所帮助
ConvertBSTR2Char(BSTR bstr, char * pChar, int * pLen)
{
char szConverted[8192];
memset(szConverted, 0, sizeof(szConverted));

char szTmp[3];
memset(szTmp, 0, sizeof(szTmp));

int iLen = *(int*)& ((char*)bstr)[-4];
int iConverted = 0;
int iIsTwo = 0;

for(int i = 0; i < iLen; i ++)
{
if (bstr[i] >= 0x80 && bstr[i] < 256)
{
szConverted[iConverted ++] = (char)bstr[i];
}
else
{
iIsTwo = WideCharToMultiByte(CP_ACP,0,&bstr[i],1,(char *)

szTmp,3,NULL,NULL);

if(iIsTwo == 1){
szConverted[iConverted ++] = szTmp[0];
//AfxMessageBox("英文");
}else{
szConverted[iConverted ++] = szTmp[0];
szConverted[iConverted ++] = szTmp[1];
//AfxMessageBox("中文");
}
}
}

*pLen = iConverted;
memcpy(pChar, szConverted, iConverted);
}

其中代码比较简单,故不再多加注释。


guan98413 发表于:2007.09.06 15:05 ::分类: ( 一般分类 ) ::阅读:(55次) :: 评论 (0) :: 引用 (0)
===========================================================
创建windows启动后自运行程序以及指定进程名查杀进程
===========================================================

创建windows启动后自运行程序以及指定进程名查杀进程
1、创建windows启动后自运行程序方法可以采用以下方法:
(1)在win.ini中添加
(2)通过更改注册表,在注册表HKEY_LOCAL_MACHINE/SoftWare/Microsoft/Windows/CurrentVersion/Run下添加新的项
以上两种方法都可行,但考虑以后扩展,通过更改注册表比较方便,因为:dotnet平台首推的是xml格式的配置文件而不建议使用ini配置格式,但对注册表的操作依然选择,毕竟windows下的好多程序都是通过注册表来配置的。
2、指定进程名查杀进程可以通过调用以下系统方法
CreateToolhelp32Snapshot(), Process32First(), OpenProcess(), TerminateProcess(), Process32Next()等,具体函数说明及各个参数成员的含义请参阅MSDN说明文档。需要注意的是,使用前先#include <tlhelp32.h> // for CreateToolhelp32Snapshot
3、先面通过一个程序片段来展现在vc开发环境中如何使用
char szFileName[100];
memset(szFileName, 0, sizeof(szFileName));

GetModuleFileName(NULL, szFileName, sizeof(szFileName));

AfxMessageBox(szFileName);

//
HKEY hKey = NULL;
long lErrorCode = -1;
// 设置开机自动运行
hKey = NULL;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare/Microsoft/Windows/CurrentVersion/Run", NULL, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
{
RegSetValueEx(hKey, "KillThread", 0, REG_SZ, (BYTE *)szFileName, strlen(szFileName));
}
//以上代码实现了对注册表的更改,是该程序能够实现windows启动后自运行;

HANDLE hSnapShot = NULL;
char szThreadName[100];
memset(szThreadName, 0, sizeof(szThreadName));

// get the thread name
::GetDlgItemText(this->m_hWnd, IDC_EDIT_THREADNAME, szThreadName, sizeof(szThreadName));
AfxMessageBox(szThreadName);
//strcpy(szThreadName, "SimSIUXFS3.EXE");

hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapShot == NULL)
{
return;
}

//LONG nProcess = 0;
PROCESSENTRY32 prosInfo;
prosInfo.dwSize = sizeof(prosInfo);
BOOL bStatus = Process32First(hSnapShot, &prosInfo);
while (bStatus)
{
CString scTmp = prosInfo.szExeFile;
if(scTmp.Compare(szThreadName) == 0)
{
DWORD dwProcessID = prosInfo.th32ProcessID;
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID);
::TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
bStatus = Process32Next(hSnapShot, &prosInfo);
}

以上代码展现了如何通过进程名来kill指定进程。

4、通过以上代码,我们可以再延伸一下,可以做一个程序,能实现对当前系统进程做一个统计,如果再加一些功能,可能做成和windows资源管理器差不多的一个工具,我们可以设置该程序是否可以自动运行,如果要取消自动运行,只需要通过RegDeleteKey删除相应注册表项就可以。也可以在我们的其他程序中添加如上功能,如果和其他特性配合使用,不失为一大亮点。


guan98413 发表于:2007.08.09 14:45 ::分类: ( 一般分类 ) ::阅读:(48次) :: 评论 (0) :: 引用 (0)
===========================================================
字符串中的非可见字符(数字方式来表示非可见字符)表示问题
===========================================================

我们在使用c/c++字符串时不可避免的会用的字符的非字符表示,,比如有一些字符是非可见的,怎么表示?一般是采用八进制、十六进制、二进制等各种各样的表示形式,并没有固定的格式,根据个人爱好和当前的编程规范来选择.也许不会有人注意到其中可能存在的问题,看下面的代码,有没有什么不妥?
#include "stdafx.h"
#include <memory>

int main(int argc, char* argv[])
{
char szTmp[10];
memset(szTmp, 0, sizeof(szTmp));
memcpy(szTmp, "123/x00123", 7);

return 0;
}
上面代码的原意是实现:对szTmp数组的前七(7)个字节进行赋值,前面三个和后面三个字节分别问'1', '2', '3', 第3个字节(从0开始记数)为0x00,上面的代码能顺利编译通过么?
让我们用vc6编译看看,编译器怎么报错呢?
error C2022: '291' : too big for character
到底是什么原因?又该怎么解决呢?
原来编译器对字符进行解析的时候将/x00123认为是一个字符,0x00123的十进制表示正好是291,怎么避免这种问题?实际上可以试试下面的方法:
#include "stdafx.h"
#include <memory>

int main(int argc, char* argv[])
{
char szTmp[10];
memset(szTmp, 0, sizeof(szTmp));
memcpy(szTmp, "123/000123", 7);

return 0;
}
主要变动是采用八进制来表示0x00,这样编译就能顺利通过,至于为什么会这样,请参阅其他文档.


 

guan98413 发表于:2007.07.26 13:56 ::分类: ( 一般分类 ) ::阅读:(67次) :: 评论 (0) :: 引用 (0)
===========================================================
都是Calling Convention惹的祸
===========================================================

使用 microsoft visual C++编写程序的人可能不太注意Calling Convention的问题,但如果经常使用动态库(dll)、静态库(lib),而这些lib或者dll还是出自不同的开发人员,或者出自不同的公司的话可能会碰到程序调用一切正常,但在return语句执行以后却突然出现莫名其妙的问题,导致程序崩溃.因为是在return以后出的问题,采用debug跟踪有点难度,为什么会出现这样的问题?又该怎么解决呢?
其实,如果出现了这样的问题,就应该检查一下project setting了,核对一下project setting--> c/c++ 下面的category中的Calling Convention设置是否一致!目前有三种设置:_cdecl* , _fastcall, _stdcall,MS默认的是_cdecl*, 有一些开发人员喜欢将其设置为_stdcall,设置的不一致也许就是造成程序崩溃的主要原因.这三种设置的主要区别实际上是对于堆栈的维护由谁来负责,调用者负责清理还是被调用者自己维护??设置不同堆栈的维护者就不同,就有可能造成调用者和被调用者同时去清理堆栈,造成程序崩溃.
:_cdecl* , _fastcall, _stdcall三种设置对程序的影响的不同之处可以查看相应的文档.


guan98413 发表于:2007.07.19 15:04 ::分类: ( 一般分类 ) ::阅读:(70次) :: 评论 (0) :: 引用 (0)
===========================================================
vc实现将文本文件按照每行多少字符进行分割
===========================================================

在一个项目中对方曾提出要求:打印机打印可以指定每一行打印多少字符,打印多少行进行切纸.为实现这一要求做了以下函数,具体思路如下:先将要打印的文件按照要求组织成一个临时文件,在组织文件的过程中特别需要注意的是,中英文的识别和处理.
现将代码贴在下面,希望能对有这方面需求的朋友有所帮助或提示,也希望各位能提出自己的看法,见解.(目前这段代码对异常处理不够.)
TransformFile(const char * pSourceName, const char * pDesName, int iStringLen)
{
HANDLE hPtrFile = NULL;
hPtrFile = ::CreateFile(pSourceName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_READONLY,
NULL);
if(hPtrFile == INVALID_HANDLE_VALUE)
{
CloseHandle(hPtrFile);
hPtrFile = NULL;
}

if(hPtrFile != NULL)
{
DWORD dwPtrFileLen = ::GetFileSize(hPtrFile , NULL);
unsigned char *ptrFileData = new unsigned char[dwPtrFileLen + 2];
if(ptrFileData == NULL)
{
return -1; //内存不足
}
else
{
memset(ptrFileData, 0, dwPtrFileLen + 2);
}

DWORD dwReadData = 0;

::ReadFile(hPtrFile, (LPVOID)ptrFileData, dwPtrFileLen, &dwReadData, NULL);

//创建目标文件
FILE * fDes;
fDes = fopen(pDesName, "w+");
if(fDes == NULL)
return -2; // can not create the des file

DWORD dwCurPos = 0; //源文件数据的位置

//对源文件中的数据按照设定的行长进行划分后填入目标文件中
unsigned char * pTmp;
pTmp = (unsigned char *)malloc(iStringLen + 2);
int iTmp = 0;

while(dwCurPos < dwReadData)
{
if(iTmp == 0)
memset(pTmp, 0, iStringLen + 2);

if(ptrFileData[dwCurPos] < 0x7F) //非汉字
{
if(iTmp <= iStringLen - 1)
{
memcpy(&pTmp[iTmp], &ptrFileData[dwCurPos], 1);
iTmp ++;
dwCurPos ++;
}
else
{
//写入目标文件
//对分割后这一行的最后一个字符是0x0D 0x0A的情况做特殊处理
if(pTmp[iTmp -1] == 0x0D)
{
pTmp[iTmp - 1] = 0x00;
iTmp --;
fwrite(pTmp, iTmp , 1, fDes);
fflush(fDes);
fwrite("x0Dx0A", 2, 1, fDes);
fflush(fDes);
dwCurPos ++; //过滤掉接下来的0x0A(在window记事本程序所创建的文件
//0x0D 0x0A 是紧挨着的,如果仅仅写入一个0x0D,则系统
//自动补一个0x0D)

}
else if(pTmp[iTmp -1] == 0x0A)
{
fwrite(pTmp, iTmp , 1, fDes);
fflush(fDes);
}
else
{
fwrite(pTmp, iTmp , 1, fDes);
fflush(fDes);
fwrite("x0Dx0A", 2, 1, fDes);
fflush(fDes);
}

iTmp = 0;
}

}
else //汉字
{
if(iTmp <= iStringLen - 2)
{
memcpy(&pTmp[iTmp], &ptrFileData[dwCurPos], 2);
iTmp = iTmp + 2;
dwCurPos = dwCurPos + 2;
}
else
{
//写入目标文件
fwrite(pTmp, iTmp , 1, fDes);
fwrite("x0Dx0A", 2, 1, fDes);
fflush(fDes);
iTmp = 0;
}
}
}

//将最后一行写入文件
fwrite(pTmp, iTmp + 1, 1, fDes);
fwrite("x0Dx0A", 2, 1, fDes);

//释放资源
fclose(fDes);
free(pTmp);
free(ptrFileData);
CloseHandle(hPtrFile);
hPtrFile = NULL;
}
return 0;
}


guan98413 发表于:2007.07.18 09:17 ::分类: ( 一般分类 ) ::阅读:(96次) :: 评论 (0) :: 引用 (0)
===========================================================
c/vc字符编码转换解决方案
===========================================================

利用c或者vc编写程序的过程中免不了要做一些字符的转化,比较常见的有从ANSI到UNICODE,或者从UNICODE到ANSI,如何做这样的转换呢?结合笔者的经验,暂时提供两种比较常见的方法,以及各个方法需要注意的问题
(1)标准c中的转换
可以调用mbstowcs函数
函数原型为:size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count );
头文件为:<stdlib.h>
所支持的操作系统为:ANSI, Win 95, Win NT
在使用这个函数做转换时需要注意的是对于非英语为本地语言的国家和地区,在使用之前要调用setlocale函数,否则转换出来的字符可能不是用户希望得到的结果。
setlocale:
函数原形为:char *setlocale( int category, const char *locale );
头文件:<locale.h>
所支持的操作系统为:ANSI, Win 95, Win NT
对于简体中文可以使用如下设置:setlocale( LC_ALL, "chs" );

为什么一定要调用setlocale呢?
因为在C/C++语言标准中定义了其运行时的字符集环境为"C",也就是ASCII字符集的一个子集,那么mbstowcs在工作时会将cstr中所包含的字符串看作是ASCII编码的字符,而不认为是一个包含有chs编码的字符串,所以他会将每一个中文拆成2个ASCII编码进行转换,这样得到的结果就是会形成4个wchar_t的字符组成的串,那么如何才能够让mbstowcs正常工作呢?在调用mbstowcs进行转换之间必须明确的告诉mbstowcs目前cstr串中包含的是chs编码的字符串,通过setlocale( LC_ALL, "chs" )函数调用来完成,需要注意的是这个函数会改变整个应用程序的字符集编码方式,必须要通过重新调用setlocale( LC_ALL, "C" )函数来还原,这样就可以保证mbstowcs在转换时将cstr中的串看作是中文串,并且转换成为2个wchar_t字符,而不是4个。(注:这段内容转自网络,谢谢chemz)

(2)vc中的转换
可以调用MultiByteToWideChar函数
函数原型为:
int MultiByteToWideChar(
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // address of string to map
int cchMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // address of wide-character buffer
int cchWideChar // size of buffer
);
Header: Declared in winnls.h.
Import Library: Use kernel32.lib.
在使用MultiByteToWideChar函数时需要注意的是:CodePage项可以填CP_ACP或者其他豫定义的字符集(CP_ACP比较常用),dwFlags项填MB_PRECOMPOSED比较常见,需要特别注意的是cchWideChar项最好不要使用wcslen函数计算来得到,因为好多人习惯于在使用变量前先将变量初始化为0(这也是一个很好的编程习惯,可以避免一些不必要的错误),但如果先memset为0,然后再wcslen的话,则MultiByteToWideChar返回已经转换了多少字符,但因为指定的cchWideChar为0,所以不对lpWideCharStr做任何操作,这一点要特别注意,免得出现不必要的错误。

综合以上两种方法,可以说MultiByteToWideChar是mbstowcs的增强版。

附录:
这里的codepage在MSDN定义如下

Bit Code page Description
ANSI
0 1252 Latin 1
1 1250 Latin 2: Eastern Europe
2 1251 Cyrillic
3 1253 Greek
4 1254 Turkish
5 1255 Hebrew
6 1256 Arabic
7 1257 Baltic
8 1258 VietNam
9 - 15 Reserved for ANSI
ANSI and
OEM
16 874 Thai
17 932 Japanese, Shift-JIS
18 936 Chinese: Simplified chars—PRC and Singapore
19 949 Korean Unified Hangeul Code (Hangeul TongHabHyung Code)
20 950 Chinese: Traditional chars—Hong Kong SAR, PRC and Taiwan
21 1361 Korean (Johab)
22 - 29 Reserved for alternate ANSI and OEM
30 - 31 Reserved by system.
OEM
32 - 46 Reserved for OEM
47 1258 VietNam
48 869 IBM Greek
49 866 MS-DOS Russian
50 865 MS-DOS Nordic
51 864 Arabic
52 863 MS-DOS Canadian French
53 862 Hebrew
54 861 MS-DOS Icelandic
55 860 MS-DOS Portuguese
56 857 IBM Turkish
57 855 IBM Cyrillic; primarily Russian
58 852 Latin 2
59 775 Baltic
60 737 Greek; former 437 G
61 708 Arabic; ASMO 708
62 850 Western European/Latin 1
63 437 US

setlocal 时也可使用如下方式
// 运行时设定当前 ANSI 编码,VC 格式
setlocale(LC_ALL, ".936");
其中.936中的936即是上面的codepage号

// GCC 中格式
setlocale(LC_ALL, "zh_CN.GBK");

 


guan98413 发表于:2007.06.20 10:43 ::分类: ( 一般分类 ) ::阅读:(249次) :: 评论 (0) :: 引用 (0)
===========================================================
使用vc6的Custom AppWizard创建自己的Wizard时的对Project Setting部分设置方法
===========================================================

vc6提供了一个强大的功能,Custom AppWizard,同时这个AppWizard,programmer可以定制自己的AppWizard(microsoft内部实现原理其实还是一个dll),可以很方便的重复使用代码.
怎么通过microsoft的Custom AppWizard相信各位都能很快创建出一个简单的(呵呵,经典的"Hello World")的AppWizard,但如果涉及到高级一点的,比如:
在生成的AppWizard中能对project setting中的各子项(c/c++ 的preprocessor, link部分都加载那些lib等)做一些特殊设置的时候怎么实现?先将网络上的一部分代码转载,希望碰到同样问题的朋友能依此类推,少走弯路.
(1)找到****Aw.cpp 文件中的void C*****AppWiz::CustomizeProject(IBuildProject* pProject)函数.
(2)对CustomizeProject函数进行如下修改
using namespace DSProjectSystem;

long lNumConfigs;
IConfigurationsPtr pConfigs;
IBuildProjectPtr pProj;
CString sTemp;
// Needed to convert IBuildProject to the DSProjectSystem namespace
pProj.Attach((DSProjectSystem::IBuildProject*)pProject, true);

pProj->get_Configurations(&pConfigs);
pConfigs->get_Count(&lNumConfigs);
//Get each individual configuration
for (long j = 1 ; j < lNumConfigs+1 ; j++)
{
_bstr_t varTool;
_bstr_t varSwitch;
IConfigurationPtr pConfig;
_variant_t varj = j;

pConfig = pConfigs->Item(varj);

varTool = "link.exe";//修改链接选项
varSwitch = "yourlib.lib";
pConfig->AddToolSettings(varTool, varSwitch, varj);
}
需要注意的是:
此方法使用了microsoft的COM技术,为顺利编译通过请包含以下头文件
#import "../Bin/IDE/devbld.pkg"
#include <ObjModel/bldauto.h>
#include <ObjModel/blddefs.h>
#include <ObjModel/bldguid.h>详细内容请参阅MSDN


guan98413 发表于:2007.06.15 15:56 ::分类: ( 一般分类 ) ::阅读:(127次) :: 评论 (0) :: 引用 (0)
===========================================================
vc6.0中很多函数编译不通过的解决方案
===========================================================

在vc6.0中经常会有函数 例如 TryEnterCriticalSection 正常的加载了 头文件 ,库文件,但是编译还是出错的问题。

这个时候要考虑是不是windows编译其中设定的windows版本的问题了。

具体修改办法是:

在 project--->setting --->c/c++--->Preprocessor definitions 中添加 _WIN32_WINNT=0X0500 . (其中 0x0500 可变)



或者

stdafx.h文件加上这行就可以了,但必须保证自己的机器是NT系统

#define _WIN32_WINNT 0x0500


guan98413 发表于:2007.05.04 17:53 ::分类: ( 一般分类 ) ::阅读:(103次) :: 评论 (0) :: 引用 (0)
===========================================================
error C2065: 'TryEnterCriticalSection' : undeclared identifier
===========================================================

error C2065: 'TryEnterCriticalSection' : undeclared identifier的解决方案
可以通过在头文件前添加如下内容解决
#ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x500
#endif

比如
#include "stdafx.h"

#ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x500
#endif

#include "afxwin.h"
#include "winbase.h"

 


int main(int argc, char* argv[])
{
TryEnterCriticalSection(NULL);

printf("Hello World!n");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值