显示标签为“windows”的博文。显示所有博文
显示标签为“windows”的博文。显示所有博文

2010/04/29

VC2005 --> 2008

没有评论:
Vs2008兼容vs2005 的项目;但vs2008的项目却不能放在vs2005中.

将vs2008 项目 转换成到2005 下的解决方法:
l. 修改解决方案文件:解决方案.sln
Microsoft Visual Studio Solution File, Format Version 10.00 [9.00]
# Visual Studio 2008 [2005]

2. 修改项目文件:项目.vcproj
delete ToolsVersion="3.5"
change MSBuildTools to MSBuildbin
通过以上步骤就可以用Vs2005打开vs2008下的项目.

另:vs2008下使用的类库跟vs2005的类库是有区别的:
1 删除 using System.Linq;
2 移除包含!号的引用


手动卸载 Visual Studio 2005/2008
refer to http://support.microsoft.com/kb/907965

or 卸载 Visual Studio 2008 组件时,必须按照以下顺序进行。 (VS2005类同)

打开“添加或删除程序”(Windows Server 2003 和 Windows XP)或“程序和功能”(Windows Vista 和 Windows Server 2008)。

1. 删除“Microsoft SQL 发布向导”。

2. 删除“Crystal Reports Basic for Visual Studio 2008”。

3. 删除“Crystal Reports Basic for Visual Studio 2008 64 位运行库(x64)”。 只有当 Visual Studio 安装在 64 位计算机时,才需要此步骤。

4. 删除“Microsoft Windows SDK for Visual Studio 2008 SDK 引用程序集和 IntelliSense”。

5. 删除“Microsoft Windows SDK for Visual Studio 2008 .NET Framework Tools”。

6. 删除“Microsoft Windows SDK for Visual Studio 2008 Win32 Tools”。

7. 删除“Microsoft Windows SDK for Visual Studio 2008 标头和库”。

8. 删除“Microsoft Windows SDK for Visual Studio 2008 Tools”。

9. 删除“Microsoft Visual Studio 2008 远程调试器”。 只有当 Visual Studio 安装在 64 位计算机时,才需要此步骤。

10. 删除“Microsoft SQL Server 2005 Express Edition”。

11. 删除“Microsoft SQL Server Native Client”。

12. 删除“Microsoft Device Emulator 3.0 版”。

13. 删除“Windows Mobile 5.0 SDK R2 for Smartphone”。

14. 删除“Windows Mobile 5.0 SDK R2 for Pocket PC”。

15. 删除“Microsoft SQL Server Compact 3.5 for Devices”。

16. 删除“Microsoft SQL Server Compact 3.5 设计工具”。

17. 删除“Microsoft SQL Server Compact 3.5”。

18. 删除“Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime”。

19. 删除“Microsoft Visual Studio Tools for the Microsoft Office system (3.0 版运行库)”。

20. 删除“Microsoft .NET Compact Framework 3.5”。

21. 删除“Microsoft .NET Compact Framework 2.0 SP2”。

22. 删除“Microsoft Visual Studio”。

23. 删除“Microsoft Visual Studio Web 创作组件”。

24. 删除“Microsoft Document Explorer 2008”。

25. 删除“Microsoft Visual Studio 2008 64 位系统必备”。 只有当 Visual Studio 安装在 64 位计算机时,才需要此步骤。

26. 删除“Microsoft .NET Framework 3.5”。

2009/07/29

如何调用DLL (基于Visual C++6.0的DLL)

没有评论:
一、前言

  自从微软推出16位的Windows操作系统起,此后每 种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外 一种形式代表着,例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。

  在Windows操作系统中使用 DLL有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个DLL文件,真正实现了资源"共享",大大缩小了应用程序的执 行代码,更加有效的利用了内存;使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修 改相应的DLL文件就可以了,而且,当DLL中的函数改变后,只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用,大大提高了软件开发和 维护的效率。

  既然DLL那么重要,所以搞清楚什么是DLL、如何在Windows操作系统中开发使用DLL是程序开发人员不得不 解决的一个问题。本文针对这些问题,通过一个简单的例子,即在一个DLL中实现比较最大、最小整数这两个简单函数,全面地解析了在Visual C++编译环境下编程实现DLL的过程,文章中所用到的程序代码在Windows98系统、Visual C++6.0编译环境下通过。

  二、DLL的概念

   DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用, 这些客户可以是应用程序或者是其它的DLL。DLL库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名 为*.LIB),Visual C++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此 时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。

  在动态库的情况下,有两个文 件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB 文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中 所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL 和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。

  微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有 消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序 不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C++、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。

  常规DLL又可细分成静态链接到MFC和动态链接到MFC上的,这两种常规DLL的区别将在下面介绍。与常规DLL相比,使用扩展DLL用于导出增强MFC基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从MFC所继承下来的类。

   扩展DLL是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你已经创建了一个从MFC的CtoolBar类的 派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。

三、动态链接库的创建

   在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link Library或MFC AppWizard[dll]来以不同的方式来创建Non-MFC Dll、Regular Dll、Extension Dll等不同种类的动态链接库。

  1. Win32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库

   每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果 应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对 DllMain()函数按照下面的格式书写。
 

 

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
.......
case DLL_THREAD_ATTACH:
.......
case DLL_THREAD_DETACH:
.......
case DLL_PROCESS_DETACH:
.......
}
return TRUE;
}

   参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择 符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动 态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用、DLL_THREAD_ATTACH: 线程被调用、DLL_PROCESS_DETACH: 进程被停止、DLL_THREAD_DETACH: 线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数 或变量了。

  我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程 序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模 块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。

  1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:
 

//MyDLL.h
extern "C" _declspec(dllexport) int Max(int a, int b);
extern "C" _declspec(dllexport) int Min(int a, int b);
//MyDll.cpp
#i nclude
#i nclude"MyDll.h"
int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}

   该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文 件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要 用到它。读者可能已经注意到在MyDll.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。

  2)用.def文件创建工程MyDll

  为了用.def文件创建DLL,请先删除上个例子创建的工程中的MyDll.h文件,保留MyDll.cpp并在该文件头删除#i nclude MyDll.h语句,同时往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码:

LIBRARY MyDll
EXPORTS
Max
Min

   其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加 @n,如Max@1,Min@2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到 MyDll.dll和MyDll.lib文件。

  2.MFC AppWizard[dll]方式生成常规/扩展DLL

   在MFC AppWizard[dll]下生成DLL文件又有三种方式,在创建DLL是,要根据实际情况选择创建DLL的方式。一种是常规DLL静态链接到MFC, 另一种是常规DLL动态链接到MFC。两者的区别是:前者使用的是MFC的静态链接库,生成的DLL文件长度大,一般不使用这种方式,后者使用MFC的动 态链接库,生成的DLL文件长度小;动态链接到MFC的规则DLL所有输出的函数应该以如下语句开始:
 

AFX_MANAGE_STATE(AfxGetStaticModuleState( )) //此语句用来正确地切换MFC模块状态

   最后一种是MFC扩展DLL,这种DLL特点是用来建立MFC的派生类,Dll只被用MFC类库所编写的应用程序所调用。前面我们已经介绍 过,Extension DLLs 和Regular DLLs不一样,它没有一个从CWinApp继承而来的类的对象,编译器默认了一个DLL入口函数DLLMain()作为对DLL的初始化,你可以在此函 数中实现初始化,代码如下:
 

BOOL WINAPI APIENTRY DLLMain(HINSTANCE hinstDll,DWORD reason ,LPVOID flmpload)
{
switch(reason)
{
……………//初始化代码;
}
return true;
}

  参数hinstDll存放DLL的句柄,参数reason指明调用函数的原因,lpReserved是一个被系统所保留的参数。对于隐式链接是一个非零值,对于显式链接值是零。

   在MFC下建立DLL文件,会自动生成def文件框架,其它与建立传统的Non-MFC DLL没有什么区别,只要在相应的头文件写入关键字_declspec(dllexport)函数类型和函数名等,或在生成的def文件中EXPORTS 下输入函数名就可以了。需要注意的是在向其它开发人员分发MFC扩展DLL 时,不要忘记提供描述DLL中类的头文件以及相应的.LIB文件和DLL本身,此后开发人员就能充分利用你开发的扩展DLL了。

四、动态链接库DLL的链接

   应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0在VC in目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下 面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。

  1.隐式链接

  隐式链接就是在程序开始 执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应 的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、 DllTest.cpp文件中分别输入如下代码:
 

 

//Dlltest.h
#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
//TestDll.cpp
#i nclude
#i nclude"Dlltest.h"
void main()
{int a;
a=min(8,10)
printf("比较的结果为%d ",a);
}
 

   在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的 System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern "C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,"MyDll.lib")语句,而直接在工程的Setting->Link页的Object/Moduls栏填入 MyDll.lib既可。

  2.显式链接

  显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随 时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用 LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此 后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之 前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。
 

#i nclude
#i nclude
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
A=Max(5,8);
Printf("比较的结果为%d ",a);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}

   在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中 并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用 FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。

   使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用 MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为 GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会 发生错误。

2009/06/30

Linux下用smbmount命令挂载Windows共享

没有评论:
在Windows操作系统之间,可以通过映射网络驱动器的方式,将某个共享目录映射成一个磁盘文件系统,在Linux下,可以通过smbmount命令来实现相似的功能,将Windows的某个共享目录挂载到Linux下的某个目录下。

Note: ubuntu GUI下的"connect to server"并未真正mount windows shared filesystem, so can not see any mounted directory in terminal.

Let's manually mount a windows share thru commands!


1. Install smbmount

sudo apt-get install smbfs


2. Create a mount point "~/Desktop/winxp" in Ubuntu

fanghui@vbox:~/Desktop$ mkdir winxp # 必须先创建目录 winxp


3. smbmount command.

语法:smbmount //IP地址/共享名 挂载点 -o username=xxx,password=yyy
For example:
挂载整个c$共享
$ sudo smbmount //155.69.148.204/c$ ~/Desktop/winxp -o username=xxx
Password:

挂载某个目录"fanghui"
$ sudo smbmount //155.69.148.204/fanghui ~/Desktop/winxp -o username=xxx,password=xxxxxx


现在用mount查看,会看到最末一行:
//155.69.148.204/fanghui on /home/fanghui/Desktop/winxp type cifs (rw,mand)

4. umount
$ sudo umount ~/Desktop/winxp


Refer to:
Accessing an SMB Share With Linux Machines

2009/05/29

windows XP 下用virtual box安装 ubuntu

没有评论:
虚拟机软件 :
Virtualbox是一个十分小
巧的虚拟化 软件,开源免费,相当不错。而且基本功能都具备,个人使用完全没有问题。约20M。 2008年2月virtualbox原来的公司 innotek被sun收购。

VMware Workstation with ACE, 600多M的安装包,适合公司内使用,便于管理多个设备。

Virtual PC 为微软产品。

本文介绍如何在windows XP 下用virtual box安装 ubuntu9.04

1. 安装 virtual box, 运行
点击“new”按钮创建一个ubuntu虚拟机

2. 不着急运行虚拟机,先配置ISO虚拟光盘。点击“setting”,在“光驱”选项中勾选“分配光驱”,点虚拟光盘。打开,创建一个并指向硬盘上的文件(下载 ubuntu-9.04-desktop-i386.iso文件)。

3 运行该虚拟机。会提示安装,余下皆如直接安装ubuntu过程。在预留硬盘空间时,选择 动态调整大小,并使用整个“硬盘”。该操作不会覆盖windows host也不占用整个空间,虚拟机只是在你的windows下开辟了一个目录存放。

注意: right ctrl 为切换键, right ctrl + F 为全屏切换。

其他问题:
1. VirtualBox Ubuntu全屏 , 分辨率
2. 共享文件
解决办法:
点击vbox菜单 devices -> install guest additions (似乎无反应). 重启后会发现在Ubuntu桌面上多出一个vbox光盘图标,这张光盘默认被自动加载到了文件夹/media/cdrom0 (或 链接 /cdrom )。

进入命令行终端,输入:
cd /media/cdrom0
sudo ./VboxLinuxAdditions.run
开始安装工具包。安装完毕后会提示要重启Ubuntu。之后屏幕分辨率问题应该解决。 windows 与ubuntu之间共享可以简单处理如下: windows设置共享目录, ubuntu connects to server。 或
借助virtual box设置共享文件夹
重启完成后点击"设备(Devices)" -> 共享文件夹(Shared Folders)菜单,添加一个共享文件夹,选项Make Permanent是指该文件夹是否是持久的。共享名可以任取一个自己喜欢的,比如"flamingo",尽量使用英文名称。
挂载共享文件夹
重新进入虚拟Ubuntu,在命令行终端下输入:
sudo mkdir /mnt/shared
sudo mount -t vboxsf flamingo /mnt/shared
其中"flamingo"是之前创建的共享文件夹的名字。OK,现在Ubuntu和主机可以互传文件了。
假如您不想每一次都手动挂载,可以在/etc/fstab中添加一项
flamingo /mnt/shared vboxsf rw,gid=100,uid=1000,auto 0 0
这样就能够自动挂载了。
注意:
共享文件夹的名称千万不要和挂载点的名称相同。比如,上面的挂载点是/mnt/shared,如果共享文件夹的名字也是shared的话,在挂载的时候就会出现如下的错误信息(看http://www.virtualbox.org/ticket/2265):
/sbin/mount.vboxsf: mounting failed with the error: Protocol error
原因分析可以看《Tips on running Sun Virtualbox》的Shared Folder on a Linux Guest节。
卸载的话使用下面的命令:
sudo umount -f /mnt/shared

2009/05/05

检查C++中的内存泄漏 -Visual Leak Detector

没有评论:

Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具,用户可从http://www.codeproject.com/tools/visualleakdetector.asp下载,该软件以库形式与用户的被测工程一起使用,由于VLD是按LGPL(GNU LESSER GENERAL PUBLIC LICENSE)协议对外开源,所以不必担心版权问题。

使用VLD

先从网站下载VLDzip包,当前最高版本是V1.0,解压后得到vld.hvldapi.hvld.libvldmt.libvldmtdll.libdbghelp.dll等文件,把这些所有.h头文件拷贝到VC默认的include目录下,将所有.lib文件拷贝到VC默认的lib目录下,安装工作就完成了。
使用VLD很简单,只须在包含入口函数的CPPC文件中把vld.h头文件包含进来即可。该include语句要求放在最前面,如果当前工程定义预编译head文件(如stdafx.h),则放在“#include ”语句之后就可以了。之后正常编译、按Debug方式运行被测程序,等程序运行结束时,查阅VCoutput窗口,会有“Visual Leak Detector is now exiting.”一句打印信息,在这条件信息之前,如果当前程序没有内存泄露会有“No memory leaks detected.”信息打印,但如果有内存泄露,将有类似如下信息打印:
C:"VcTester21"sample"vc6"SampleMain.c (80): main
crt0.c (206): mainCRTStartup
0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle
Data: CD CD CD CD CD ........ ........
Visual Leak Detector detected 1 memory leak.
这个信息指明当前发生内存泄露所在的函数及源文件行号,泄露内存块的地址、长度及当前内存值。用鼠标双击指示源码行的提示信息,VC即自动跳转到相应代码行,我们就很方便的知道是哪一行出错了。
可以看出,VLD用起来很简单,对它的实现原理感兴趣的朋友可以阅读VLD源码
memoryleak.cpp
#include "stdafx.h"
#include

int _tmain(int argc, _TCHAR* argv[])
{
char *pTest = new char[10];

return 0;
}


从output窗口我们可以看到有内存泄漏:
Visual Leak Detector Version 1.0 installed (multithreaded DLL).
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 109 at 0x003ACEC8: 10 bytes ----------
Call Stack:
e:\example\memoryleak\memoryleak\memoryleak.cpp (10): wmain
f:\rtm\vctools\crt_bld\self_x86\crt\src\crtexe.c (583): __tmainCRTStartup
f:\rtm\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): wmainCRTStartup
0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle
Data:
CD CD CD CD CD CD CD CD CD CD ........ ........

Visual Leak Detector detected 1 memory leak.
“MemoryLeak.exe”: 已卸载“C:\WINDOWS\system32\dbghelp.dll”
“MemoryLeak.exe”: 已卸载“C:\WINDOWS\system32\version.dll”
Visual Leak Detector is now exiting.
程序“[5056] MemoryLeak.exe: 本机”已退出,返回值为 0 (0x0)。
很方便我们找出内存泄漏的地方!

2009/03/31

how to get python25_d.lib and python25_d.dll

没有评论:
If do want to use "python25_d.lib" and/or "python25_d.dll" to debug python scripts,
can use Visual C++ to compile python25 source code.

1. download python-2.5.4.tgz (11M) from python's official website:
http://www.python.org/ftp/python/2.5.4/Python-2.5.4.tgz

2. Unzipped and look for directory "python-2.5.4\PCbuild8\"
(Note that: directory ".\PCbuild\" is for VC 7.0)

Use VC++ 2005 (ver8.0) to open the pcbuild.sln under directory ".\PCbuild8\". You will see 20 projects. Build only two projects "python" and "pythoncore".


3. There will be two files "python25_d.lib" and "python25_d.dll" generated under directory ".\PCbuild8\win32debug". Copy them into "c:\python25\libs" and "c:\windows\system32"
respectively. Previously, "python25.dll" and "python25.lib" already there.


4. Turn on "debug" in VC and rebuild. Succeed.

However, I did not figure out how to use debug version in VC to debug into my python file.:-(

Note: Python's latest version is 2.6. But since I use "pylab/matplotlib" which currently only offers package ver0.98 for python2.5 under windows. So,... python2.5.4 is my choice.

2009/03/29

C++和python的相互调用-II

没有评论:
编写扩展 Use python to write extension for C++ program

Visual C++ 2005 下创建新 Win32/ Win32 DLL project. 这样不用手写 *.def文件和手工编译链接。
然后将附带cpp文件做成 dll.

Python can only use this "*.dll" by changing it to "*.pyd".

Example:
1. Change the built "pyUtil.dll" to file name "pyUtil.pyd".
2. In python command line:
import sys
sys.path.append(".\\") # where pyUtil.pyd locates
# Or, put pyUtil.pyd file under python dll directory, "C:\Python25\DLLs".
# Note: "C:\Python25\libs" store static library like "pyUtil.lib".
import pyUtil
pyUtil.Recognise("ddddd")


C program can use python extension like static library.
That is: C program with pyUtil.py under the same directory,
which needs support of "C:\python25\libs\python25.lib".

C program can use this "*.dll" normally.
The usage is same as above.
Note that put pyUtil.dll under directory "c:\windows\system32\".



Source code for dll:
//////////////////////////////////////////////////////////////////
// pyUtil.cpp :


#ifdef _MANAGED
#pragma managed(push, off)
#endif


#include "stdafx.h"
#include "string.h"
#include "Python.h" // added

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
/*
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
*/
return TRUE;
}


/////////// my code
std::string Recognise_Img(const std::string url)
{ return "hello, " +url;
}

static PyObject* Recognise(PyObject *self, PyObject *args)
{
const char *url;
std::string sts;

if (!PyArg_ParseTuple(args, "s", &url)) // parse python objects from input
return NULL;

sts = Recognise_Img(url); // add your code here.

return Py_BuildValue("s", sts.c_str() ); // return python objects if used in python
}


static PyMethodDef AllMyMethods[] = { // declare of function list
{"Recognise", Recognise, METH_VARARGS}, // function name
{NULL, NULL} // need this to end decl
};

extern "C" PyMODINIT_FUNC initpyUtil() // initMyPythonModuleName
{
PyObject *m, *d;
m = Py_InitModule("pyUtil", AllMyMethods); // Module Name = file name
d = PyModule_GetDict(m);
}



#ifdef _MANAGED
#pragma managed(pop)
#endif

2009/03/20

C++和Python的相互调用

没有评论:
c++和python的互相调用


简单配置如下:

python安装目录: C:\Python26
头文件包含:
VStudio->Tools->Options->Directories->Include files 加入 C:\PYTHON26\INCLUDE
库文件包含:
VStudio->Tools->options->Directories->Library files 加入 C:\PYTHON26\LIBS

如果是debug版本,有可能会提示can't open file "python26_d.lib"没有调试版本的类库.
Solution: 把C:\Python26\libs\python26.lib复制一个python26_d.lib即可
否则直接用release版本就行; Or change python26_d.lib to python26.lib in "pyconfig.h" file, and comment "#define Py_DEBUG".


工程文件中包含了c++调用python中的函数,也同时把c++的函数做成了dll,以供python之调用;
所以也就发生另个一个问题,c++调用python时,最后关闭了python解释器
Py_Finalize(); 以至于python又调用dll时,发生错误;所以在生成dll时,注释掉
Py_Initialize();以及Py_Finalize();


若没有装VC,可以去微软网站下一个C++的编译器 VCTookitSetup.exe.
Under VC->VStudio Tools-> VStudio 2005 command prompt , 执行命令 cl cfile编译。


举例:

1、C中调用PYTHON
  #include
  int main(int argc, char *argv[])
  {
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
  "print 'Today is',ctime(time())\n");
  Py_Finalize();
  return 0;
  }
  直接用CL 文件名 编译就是

2、
PYTHON调用由C生成的DLL
  C代码:如FOO.C
  #include
  /* Define the method table. */
  static PyObject *foo_bar(PyObject *self, PyObject *args);
  static PyMethodDef FooMethods[] = {
  {"bar", foo_bar, METH_VARARGS},
  {NULL, NULL}
  };
  /* Here's the initialization function. We don't need to do anything
  for our own needs, but Python needs that method table. */
  void initfoo()
  {
  (void) Py_InitModule("foo", FooMethods);
  }
  /* Finally, let's do something ... involved ... as an example function. */
  static PyObject *foo_bar(PyObject *self, PyObject *args)
  {
  char *string;
  int len;
  if (!PyArg_ParseTuple(args, "s", &string))
  return NULL;
  len = strlen(string);
  return Py_BuildValue("i", len);
  }
  C定义文件:foo.def
  EXPORTS
  initfoo
  编译生成foo.dll
  cl -c foo.c;
  link foo.obj /dll /def:foo.def /OUT:foo.dll
将foo.dll 改名为 foo.pyd
  在PYTHON中调用:
  import foo
  dir(foo)
  …
  即可以看到结果:
  >>> import foo
  >>> dir(foo)
  ['__doc__', '__file__', '__name__', 'bar']
  >>> ^Z
为简化python使用C的数据类型,可以 import ctypes . it is better over pyrex .


3 C调用由python生成的dll
写一个C程序,该程序存放调用python的函数接口。然后将该C程序和python程序一起做成DLL即可。


主要参考

C++ 扩展和嵌入 Python
http://www.vckbase.com/document/viewdoc/?id=1540

2008/01/31

Ubuntu启动菜单: 使XP变为默认启动系统

没有评论:
装Ubuntu和XP双系统后,启动菜单上 Ubuntu 是缺省项。如何修改使XP成为默认的操作系统?
其实很简单,修改 /boot/grub/menu.lst 文件,使其中default值变动一下即可。
过程如下:

1、打开命令行终端;
2、输入:
sudo cp /boot/grub/menu.lst /boot/grub/menu.lst.bak
sudo gedit /boot/grub/menu.lst
注: 第一句做备份用。
3、假设文件内容如下:
-------------------------------------------------------------
# menu.lst - See: grub(8), info grub, update-grub(8)
# grub-install(8), grub-floppy(8),
# grub-md5-crypt, /usr/share/doc/grub
# and /usr/share/doc/grub-doc/.

## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not change this entry to 'saved' or your
# array will desync and will not let you boot your system.
default 0

## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout 10

## hiddenmenu
# Hides the menu by default (press ESC to see the menu)
#hiddenmenu

## ## End Default Options ##

title Ubuntu, kernel 2.6.15-23-386
root (hd0,2)
kernel /boot/vmlinuz-2.6.15-23-386 root=/dev/hda3 ro quiet splash
initrd /boot/initrd.img-2.6.15-23-386
savedefault
boot

title Ubuntu, kernel 2.6.15-23-386 (recovery mode)
root (hd0,2)
kernel /boot/vmlinuz-2.6.15-23-386 root=/dev/hda3 ro single
initrd /boot/initrd.img-2.6.15-23-386
boot

title Ubuntu, memtest86+
root (hd0,2)
kernel /boot/memtest86+.bin
boot

### END DEBIAN AUTOMAGIC KERNELS LIST

# This is a divider, added to separate the menu items below from the Debian
# ones.
title Other operating systems:
root
# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/hda1
title Microsoft Windows XP Professional
root (hd0,0)
savedefault
makeactive
chainloader +1
-------------------------------------------------------------
现在default值为0,意即启动排行第一的操作系统,这里代表的就是Ubuntu, kernel 2.6.15-23-386。
现在把它修改成“default 4”,那么XP就成为默认的操作系统了。
因为从零数起,以title打头的Microsoft Windows XP Professional这一行排序为4。
另外我们还可以通过修改timeout的值来变更默认等待时间。