分类目录归档:Windows\C++编程

C语言Socket请求Apache服务器一直报HTTP/1.1 400 Bad Request

用C语言写了个Socket程序,发送HTTP请求到Apache服务器,一直报HTTP/1.1 400 Bad Request。尝试了无数方法,依然无果。

最终发现还是HTTP协议头的格式问题,主要就在于\r\n的问题。

把所有的\n都换成了\r\n之后,终于可以了。

注意:如果是POST请求,POST数据部分的上下要多加一个空行,也就是\r\n\r\n

OCX注册时找不到指定的模块

开发好的OCX用regsvr32注册时,经常会报“找不到指定的模块”的错误。这个错误一般是由于缺少系统依赖造成的。可根据下面的步骤进行排查解决。

1. 错误原因:OCX路径错误

仔细检查OCX路径是否输入正确。

2. 错误原因:缺少系统依赖

安装微软常用运行库,可百度搜索“微软常用运行库合集”,也可以通过下面的链接直接下载。

32位:MSVBCRTAIO_X86.zip

64位:MSVBCRTAIO_X64.zip

3. 错误原因:OCX版本不对

尝试修改VS中的目标平台位数,修改为64位或32位,再尝试注册。

4. 错误原因:缺少其它依赖

下载Depends.exe,将OCX拖入至窗口,查看缺少的依赖项。

5. 错误原因:OCX存放位置

网上有文章说,将OCX移至System32或SysWow64目录下进行注册。若以上方法均不可用,也可尝试此方法。

模块加载失败 请确保该二进制文件在指定的路径中 找不到指定的模块

原文地址:http://blog.csdn.net/u011677067/article/details/52431043

编写了一个桌面右键菜单的的Shell扩展,为了验证是否与其它系统是否兼容,故用虚拟机分别安装了Win7的64位和32位,XP的32位系统,结果注册时出现了以下问题。

反复检查,路径肯定是对的,dll模块在开发机上也没有问题,权限也使用了管理员权限。最后没有办法,就在虚拟机上安装了VS并编译程序,结果这下又能注册成功了。

锁定问题为环境配置,将项目配置属性—>常规—>MFC的使用 修改为在静态库中使用MFC。

修改后,编译过,在注册运行就没有问题了。

其实最开始也考虑过可能是项目依赖的问题,但是因为创建的是ATL项目,只是将ATL的使用改为静态。

然而测试证明MFC的使用也要改为静态,这就有点不理解,哪位高手懂的请指教一下?

权限问题:

在XP中无需关心权限,直接用regsvr32命令来注册就行了。

在Win7中如果权限不足就会报错。

这个时候需要以管理员模式来执行。

另外,根据测试发现在Win7中权限问题要看用户配置:

如上图,如果将用户账户控制改为从不通知,那么即使一般权限也可以运行成功;但如果改为其它模式,那就必须以管理员权限来运行命令了。

cmd 定时任务

CMD命令总结 AT命令2006-10-25 19:11at
这个命令的作用是安排在特定的日期或时间执行末个特定的命令和程序。
用法:AT TIME COMMAND \\COMPUTER
AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。

AT [\\computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\\computername] time [/INTERACTIVE]
[ /EVERY:date[,…] | /NEXT:date[,…]] “command”

\\computername 指定远程计算机。 如果省略这个参数,
会计划在本地计算机上运行命令。
id 指定给已计划命令的识别号。
/delete 删除某个已计划的命令。如果省略 id,
计算机上所有已计划的命令都会被删除。
/yes 不需要进一步确认时,跟删除所有作业
的命令一起使用。
time 指定运行命令的时间。
/interactive 允许作业在运行时,与当时登录的用户
桌面进行交互。
/every:date[,…] 每个月或每个星期在指定的日期运行命
令。如果省略日期,则默认为在每月的
本日运行。
/next:date[,…] 指定在下一个指定日期(如,下周四)运
行命令。如果省略日期,则默认为在每
月的本日运行。
“command” 准备运行的 Windows NT 命令或批处理
程序。
AT命令是Windows XP中内置的命令,它也可以媲美Windows中的“计划任务”,而且在计划的安排、任务的管理、工作事务的处理方面,AT命令具有更强大更神通的功能。AT命令可在指定时间和日期、在指定计算机上运行命令和程序。

我们可以在“开始→运行”中输入AT命令,下面就来看看AT命令的一些实例分析。

1、定时关机

命令:at 21:00 ShutDown –S –T30

该命令运行后,到了21:00点,电脑会出现“系统关机”对话框,并默认30秒延时自动关机。

2、定时提醒

命令:at 12:00 Net Send 10.10.36

.122与朋友约会的时间到了,快点准备出发吧!

其中Net Send是Windows内部程序,可以发送消息到网络上的其他用户、计算机。10.10.36.122是本机电脑的IP地址。这个功能在Windows中也称作“信使服务”。

3、自动运行批处理文件

如果公司的数据佷重要,要求在指定的日期/时间进行备份,那么运行:

命令:at 1:00AM /Every:Saturday My_BackUp.bat

这样,在每个Saturday(周六)的早上1:00点,电脑定时启动My_BackUp.bat批处理文件。My_BackUp.bat是一个你自行编制的批处理文件,它包含能对系统进行数据完全备份的多条命令。

4、取消已经安排的计划

命令:at 5 /Delete

有时候,你已经安排好的计划可能临时变动,这样你可以及时地用上述命令删除该计划(5为指派给已计划命令的标识编号),当然,删除该计划后,可以重新安排。

printf()函数的参数执行顺序(转)

printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的.–printf()函数的特点.

注意点:

1.printf()函数中的计算是从右向左进行的.

2.我们在写代码时,尽量避免无确定意义的表达式出现,因为不同的编译器,可能会采用不同的理解方式.

如何在网页中启动本地应用程序

说到单点登录,往往是和Portal(门户)是离不开的。通常企业中会有许多应用,WEB的或CS的。而做Portal的时候往往是做成WEB的。这时候,用户登录Portal后,如何从Portal启动本地的CS程序,就成为需要解决的问题。
不知道大家是如何解决的,我的做法是,自己实现一个协议(就象迅雷/电驴/网络蚂蚁那样),在Portal上实现一个形如
[html]
协议名称://应用名称/作业?action=动作&param1=参数1&param2=参数2…
[/html]
这样的例子可能是(我们协议名是用公司简称,这里我就用foo):
[html]
<a href=”foo://erp/order?action=query&owner=hydonlee”>我的订单</a>
[/html]
通过这样的设计,让浏览器象处理http协议的链接一样,把请示发送给我们的应用。
那如何让浏览器将这个链接发送给我们的协议处理器呢?这就需要向系统中注册一下(Windows下),注册表如下:

[csharp]
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\foo]
@=”URL: foo Application 协议”
“URL Protocol”=””

[HKEY_CLASSES_ROOT\foo\DefaultIcon]
@=”d:\\workspace\\fooPortal\\bin\\client\\foo.protocolhandler.exe,1″

[HKEY_CLASSES_ROOT\foo\shell]

[HKEY_CLASSES_ROOT\foo\shell\open]

[HKEY_CLASSES_ROOT\foo\shell\open\command]
@=”\”d:\\workspace\\fooPortal\\bin\\client\\foo.protocolhandler.exe\” \”%1\””

[/csharp]
怎么样?是不是很简单?其实将这个加入注册表之后,你可以开始->运行,输入:foo://test/ 回车,来测试你的协议处理器了!windows系统会把网址作为参数提供给命令行。
注册协议处理器的C#代码如下,我是写在协议处理器的类中的:

[csharp]
private void FooProtocolRegister() {
// copyright(c) hydonlee, 转载请注明原址
RegistryKey cr = Registry.ClassesRoot;

RegistryKey Fookey = cr.CreateSubKey(“Foo”);

//添加Foo键
Fookey.SetValue(“”, “URL: Foo Application 协议”);
Fookey.SetValue(“URL Protocol”, “”);

//添加DefaultIcon
RegistryKey iconKey = Fookey.CreateSubKey(“DefaultIcon”);
iconKey.SetValue(“”, string.Format(“{0},1”, Application.ExecutablePath.ToLowerInvariant()));

//添加Shell Key
RegistryKey shellKey = Fookey.CreateSubKey(“shell”);
RegistryKey openKey = shellKey.CreateSubKey(“open”);
RegistryKey commandKey = openKey.CreateSubKey(“command”);
commandKey.SetValue(“”, string.Format(“\”{0}\” \”%1\””, Application.ExecutablePath.ToLowerInvariant()));

Fookey.Close();
}

[/csharp]
这样,由浏览器的链接,已经传递到我们本地的应用中了,剩下的事情就比较简单了。协议处理器分析这个地址,呼叫相应的作业插件,并将参数传入。
简单来说就是:通过协议地址模型,Portal生成链接->浏览器发起请求->协议处理器分派–>各应用插件启动作业

安装SQL Server2008时报错:已安装 SQL Server 2005 Express 工具。

安装SQL Server 2008时,提示错误:

Sql2005SsmsExpressFacet 检查是否安装了 SQL Server 2005 Express 工具。 失败,已安装 SQL Server 2005 Express 工具。若要继续,请删除 SQL Server 2005 Express 工具。

sql server 2005 management和sql server 2008 management不是兼容吗?为什么会有这样的提示?

答案是SQL Server 2005 Express 工具不是sql server 2005 management,不用卸载sql server 2005 management,用一个小技巧就行:修改注册表!

打开注册表编辑器,找到HKEYLocalMachine/Software/Microsoft/Microsoft SQL Server/90/Tools/ShellSEM。

网上有的讲把这个文件夹删了,我怕删了sql server 2005 management不能用了,重命名一下,把ShellSEM改成ShellSEM1试试,结果继续安装sql server 2008 management的时候显示安装成功!打开也没问题。

只是因为前面修改了注册表,导致sql server 2005 management启动不了,双击打开界面闪一下就没有了。

接着再打开注册表把ShellSEM1改回ShellSEM,就可以打开sql server 2005 management,OK。搞定sql server 2008 management、 sql server 2005 management同时安装的问题!

数据库的版本为661,无法打开。此服务器支持662版及更低版本。不支持降级路径。

很多人会问:服务器版本比数据库版本还高,按说是可以向下兼容的,为什么会报错呢?

是这样的,662是SQL Server 2008 SP2以后的数据库版本号,SP2之前的SQL Server 2008
的数据库版本是655,而661是SQL Server 2008 R2的数据库版本号,本身SQL Server 2008 R2的版本要比SQL Server 2008 要高,按常理661版的数据库文件是不能附加到支持655版本号的SQL Server 2008里的。至于出现这个蛋疼的提示是因为微软在SQL Server 2008 SP2里加入了15k分区数的功能,而发布SP2之前就已经发布了SQL Server 2008 R2了,由于SQL Server 2008 R2 RTM并不支持15k分区的功能,如果按常规SQL Server 2008还保持655的版本号的话就可能会出现附加15k分区的数据文件到SQL Server
2008 R2 RTM中,这肯定是不能附加的,所以微软为了解决这个难题,就打破常规,SQL Server 2008 SP2里将数据库的版本号改为662,这样,由SQL Server 2008 R2 RTM的数据库版本号比SQL Server 2008 SP2的低,所以自然就不能附加了,避免了麻烦,不过为了一15k分区的功能改变了版本号带来的副作用就像楼主这种情况了。
这是问题的根本缘由。也就是说,661的数据库版本比662高。

解决办法:

第一种:

升级到 SQL Server 2008 R2。注意,下载的时候看清是R2。

第二种:

将数据库附加到SQL Server 2008 R2版的数据库实例里,生成SQL Server 2008版的脚本文件,使用脚本文件部署到SQL Server 2008里。

C语言链表 — 头插法与尾插法

说明:头插法与尾差法的差别仅仅在于以下代码的红色部分。

头插法程序

#include "stdio.h"
#include "stdlib.h"

typedef struct node{
	int x;
	struct node *next;
}F;

int main(int argc, char* argv[])
{
	F head, *p, *p1;
	p1 = (F *)malloc( sizeof(F) );
	p1->next = NULL;
	head.next = p1;
	p1->x = 0;
	for (int i = 0; i < 5; i ++) 	{ 		
                p = (F *)malloc( sizeof(F) );
                p->next = NULL;
		p->x = i + 1;
		p->next = head.next;
		head.next = p;
	}
	for (p=head.next; p!=NULL; p=p->next)
	{
		printf("%d\n", p->x);
	}
	return 0;
}

尾插法程序

#include "stdio.h"
#include "stdlib.h"

typedef struct node{
	int x;
	struct node *next;
}F;

int main(int argc, char* argv[])
{
	F head, *p, *p1;
	p1 = (F *)malloc( sizeof(F) );
	p1->next = NULL;
	head.next = p1;
	p1->x = 0;
	for (int i = 0; i < 5; i ++) 	{ 		
                p = (F *)malloc( sizeof(F) );
                p->next = NULL;
		p->x = i + 1;
		p1->next = p;
		p1 = p1->next;
	}
	for (p=head.next; p!=NULL; p=p->next)
	{
		printf("%d\n", p->x);
	}
	return 0;
}