Archive for 11月 2012

win7注册com控件失败的问题

现在的win7非常流行,但有时候win7开发软件,需要注册某个com控件,可以使用两种方式

第一种是,直接打开运行,在运行里面输入regsvr32 xxx.dll,再点运行,这种在xp下是可行的,但在win7下需要使用管理员权限,不然始终提示注册失败,模块”xxx.dll”加载失败,请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的.DLL文件是否有问题。找不到指定的程序。

第二种是,打开cmd控制台,输入regsvr32 xxx.dll按回车运行,这种在xp下也是可行,但在win7下需要管理员权限。解决方式是搜索cmd右键使用管理员权限运行,然后再使用regsvr32 xxx.dll命令。

有时候动态库的路径带有空格的文件夹名,比如C:\Program Files目录下的dll文件,那么需要使用双引号将文件路径包含起来,如regsvr32 “C:\Program Files\xxx.dll”

stl中的list,map,vector等的erase循环遍历删除元素

stl中的list,map与vector调用erase删除元素有些区别,都可以使用itor = listInt.erase(itor);的试,但vecotr不能使用listInt.erase(itor++);

//list方式
std::list<int> listInt;
for (int i = 0; i < 10; i++)
{
	listInt.push_back(i);
}

std::list<int>::iterator itor = listInt.begin();
while (itor != listInt.end())
{
	int a = (*itor);
	if (a%2 == 0)
	{
		itor = listInt.erase(itor); //此处是将erase返回的指针传给itor
		continue;
	}
	itor++;
}

Continue reading ‘stl中的list,map,vector等的erase循环遍历删除元素’ »

获取当前windows操作系统语言环境

有时候需要实现中文切换,自动根据当前语言环境显示不同界面,windows的API中有获取语言环境的函数GetSystemDefaultLangID

#include
#pragma comment(lib,"Kernel32.lib")

LANGID lid = GetSystemDefaultLangID();
switch (lid)
{
case 0X0804:
	/MessageBox(_T("Chiese"));
	break;
case 0x0409:
	//MessageBox(_T("English"));
	break;
}

下面是各语言的对照表
Continue reading ‘获取当前windows操作系统语言环境’ »

JCreator打包jar

Eclipse打包比较人性化,也比较简单,但对于JCreator打包网上说得比较少,而且也比较麻烦,下面就介绍下关于JCreator打包的步骤:

实际上JCreator打包还是用到了命令,只不过要手动更改。

一、打开菜单栏“Configure”,选择“Options”。

二、单击“Tools”,可以看到右边有个“New”按钮,单击这个按钮选择“Create Jar File”。

三、这时在“Tools”下面会自动生成“Create Jar File”项,单击这个项,右边会出关于这个项的设置,其它的默认不变,只需要更改“Arguments”为cvfm $[PrjName].jar MANIFEST.MF *,记住这里是cvfm,这里的m表示想定义自己的MANIFEST.MF文件,这个文件放在对应的工程目录下面,也就是默认生成JAR的目录。

网页中控制图片按比例缩放显示

有时候图片超出预想大小,需要将其大小改变,所有图片显示大小一致,可以使用以下方式,新建一个名为test.htm的文件,然后在里面写入以下代码:

<script language="JavaScript">
<!--//图片按比例缩放
var flag=false;
function DrawImage(ImgD){
	var image=new Image();
	var iwidth = 220; //定义允许图片宽度
	var iheight = 200; //定义允许图片高度
	image.src=ImgD.src;
	if(image.width>0 && image.height>0)	{
		flag=true;
		if(image.width/image.height>= iwidth/iheight) {
			if(image.width>iwidth)
			{
				ImgD.width=iwidth;
				ImgD.height=(image.height*iwidth)/image.width;
			}
			else {
				ImgD.width=image.width;
				ImgD.height=image.height;
			}
			ImgD.alt=image.width+"×"+image.height;
		}
		else {
			if(image.height>iheight) {
				ImgD.height=iheight;ImgD.width=(image.width*iheight)/image.height;
			}
			else {
				ImgD.width=image.width;ImgD.height=image.height;
			}
			ImgD.alt=image.width+"×"+image.height;
		}
	}
}
</script>
<!-- 此处是显示缩放后的图片-->
<img src="uploads/test.jpg>" onload="javascript:DrawImage(this);" >

CFileDialog选择多文件出错返回FNERR_BUFFERTOOSMALL

在使用CFileDialog类打开文件中,若要同时选择多个文件,需要设置OFN_ALLOWMULTISELECT属性,如下代码所示:

CFileDialog fileDlg(true, NULL, NULL, OFN_ALLOWMULTISELECT);
fileDlg.m_ofn.lpstrFilter = _T("ZV File(*.zv)\0 *.zv\0MPG File(*.mpg)\0 *.mpg\0MPEG4 File(*.mpeg4)\0 *.mpeg4\0H264 File(*.264)\0 *.264\0All File(*.*)\0 *.*\0");
if (IDOK == fileDlg.DoModal())
{
	POSITION pos = fileDlg.GetStartPosition();
	while(pos)
	{
		CString strPathName = fileDlg.GetNextPathName(pos);
		AfxMessageBox(strPathName);
	}
}

Continue reading ‘CFileDialog选择多文件出错返回FNERR_BUFFERTOOSMALL’ »

MFC打开选择文件目录对话框且显示新建文件夹按钮

在MFC中,若要打开文件目录选择对话框,需要使用BROWSEINFO结构体,具体代码如下:

void CBatchConvert::OnBrowseOutDir()
{
	// TODO: 在此添加控件通知处理程序代码
	char szPath[MAX_PATH]; //存放选择的目录路径 
	memset(szPath, 0, sizeof(szPath));   

	BROWSEINFO bi;   
	bi.hwndOwner = m_hWnd;
	bi.pidlRoot = NULL;
	bi.pszDisplayName = (LPWSTR)szPath;
	bi.lpszTitle = _T("请选择转换后的文件输出目录:");
	bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
	bi.lpfn = NULL;
	bi.lParam = 0;
	bi.iImage = 0;
	//弹出选择目录对话框
	LPITEMIDLIST lp = SHBrowseForFolder(&bi);

	if(lp && SHGetPathFromIDList(lp, (LPWSTR)szPath))
	{
		CString strOutDir;
		strOutDir.Format(_T("%s"), szPath);
		AfxMessageBox(strOutDir);
	}
}

Continue reading ‘MFC打开选择文件目录对话框且显示新建文件夹按钮’ »

MFC的ClistCtrl删除选中多行项目

MFC的ClistCtrl控件添加了多行数据后,若要删除选中的多行数据,可以使用ClistCtrl的成员函数,在网上找了很多例子,发现都有问题,因为在删除ClistCtrl行的时候,删除行下面的行会上移,那么下一个要删除的行的索引会改变,导致删除的是删除行下两行位置的数据,删除不完全。

使用下面代码可完全删除选中行:

void CBatchConvert::OnDeleteFile()
{
	// TODO: 在此添加命令处理程序代码
	POSITION pos = m_ctrlBatchFile.GetFirstSelectedItemPosition();
	while(pos)
	{
		int nIndex = m_ctrlBatchFile.GetNextSelectedItem(pos);
		m_ctrlBatchFile.DeleteItem(nIndex);
		pos = m_ctrlBatchFile.GetFirstSelectedItemPosition(); //这步很重要,不然删除不完全
	}
}

MFC的Tab Control属性页中添加右键菜单事件

在MFC中,如果想要给Tab Control的某一个属性页添加右键菜单,那么首先要在资源里添加菜单内容,并给菜单内容设置事件处理。

然后在属性页的类中添加右键事件
Continue reading ‘MFC的Tab Control属性页中添加右键菜单事件’ »

如何删除windows服务

windows有很多服务,可以将程序设置为自动启动,例如安装MySql等程序,会在服务里看到Mysql的服务,可以设置为手动启动,或自动启动以及禁用。

若想删除某一服务的话,可以采用以下几种方式:

办法一:

用sc.exe这个Windows命令 开始——运行——cmd.exe,然后输入sc就可以看到了。使用办法很简单: sc delete “服务名”(如果服务名中间有空格,就需要前后加引号) 如针对上面的: sc delete KSD2Service .

方法二:

直接进行注册表编辑(不推荐) 打开注册表编辑器,找到下面的键值: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services一般服务会以相同的名字在这里显示一个主健,直接删除相关的键值便可。

方法三:

特殊情况 1、如果服务显示的是rundll32.exe,并且这个文件是位于system32目录下,那么就不能删除这个rundll32.exe文件,它是Windows系统的文件。这时只要清除相关的服务就可以了 2、如果一个服务删除了马上又自动建立了,说明后台有进程在监视、保护。需要先在进程管理器中杀掉相应的进程,或者启动后按F8,到安全模式下删除。

方法四:

其它参考用ICEWORD等第三方工具删除。