马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Crazy迷恋. 于 2013-7-18 10:58 编辑
昨天看到一个叫下载者的东西~~~一下手痒就自己也写了一个非常没脑子的(这里只做技术上的研究,不是拿这东西去搞破坏,就这玩意也没什么破坏的~~~),在写的过程中出现了一些比较严重的问题。
开发环境:VS2010
代码如下:#include <conio.h>
#include <stdio.h>
#include <Windows.h>
#include <Urlmon.h>
#pragma comment (lib, "Urlmon")
int main()
{
char *pszUrl = "http://bbs.fishc.com/forum.php?mod=attachment&aid=NDU1M3xjNGI3YmQ0OHwxMzc0MDcxNDkzfDIxMzg3NnwxNzg1NQ%3D%3D";
//char cSelfPath[MAX_PATH]="d:\\muma.rar";
char cSelfPath[MAX_PATH]={0};
int i,j;
GetModuleFileName(NULL,cSelfPath,MAX_PATH);//取得程序自身的全路径
printf("0=%s\n",cSelfPath);
//处理掉最后的一个\后面的内容
for (i=MAX_PATH;i!=0;i--)
{
if (*(cSelfPath+i)=='\\')
{
*(cSelfPath+i)='\\';
*(cSelfPath+i+1)='m';
*(cSelfPath+i+2)='m';
*(cSelfPath+i+3)='a';
*(cSelfPath+i+4)='.';
*(cSelfPath+i+5)='r';
*(cSelfPath+i+6)='a';
*(cSelfPath+i+7)='r';
*(cSelfPath+i+8)='\0';
break;
}
/*else
{
*(cSelfPath+i)='\0';
break;
}*/
}
//给每个\后在加以个'\'
//printf("1=%s\n",cSelfPath);
for (i=0;i<MAX_PATH;i++)
{
if (*(cSelfPath+i)=='\\')
{
for (j=MAX_PATH;j>=i;j--)
{
*(cSelfPath+j)=*(cSelfPath+j-1);
}
*(cSelfPath+i)='\\';
i++;
printf("1.5=%s\n",cSelfPath);
}
}
//printf("2=%s\n",cSelfPath);
//if(URLDownloadToFile(NULL, pszUrl, cSelfPath, NULL, NULL)==S_OK)
//{
// printf("下载成功!~~~");
//}
//WinExec(cSelfPath, SW_HIDE);//运行下载之后的东西~
printf("3=%s\n",cSelfPath);
getch();
return 0;
}
这里我拿了论坛的一个rar做为一个测试~~~如果我指定一个路径下载成功~~~但不能放在C盘关键目录下,可能是我的操作系统时win7 64位的 那个在c盘下可能要权限的。(不知道是不是这个原因,没到xp中测试)。
后来我改要求我要下载到和本程序同一目录下,因此就用一个API,取得全路径~~存入一个数组内。然后再对该数组进行处理。让它符合函数的路径参数要求,但是到了最后却出现
Run-Time Check Failure #2 - Stack around the variable 'cSelfPath' was corrupted. 这样的提示(在程序结束的时候。)程序能够成功下载指定URL下的资源~~~~就是到最后最后,哐当一下就给我弹出一个提示框框~~~真是讨厌~。
提示我栈损坏~~~前前后后木有溢出啊~~~数组木有越界啊~~~怎么就溢出了呢~~怎么栈就损坏了呢~~~~@竹林小溪 ,@小甲鱼,@怡静 ,@黑夜,@Dardy ,@鱼c的兄弟姐妹~~~~救命啊~~~~
PS:如果高手来解答可否帮我把上面那段处理路径的算法给优化下~~~~我的算法真的很烂~~~很烂~~狠烂~~~ 最后我就整成一篇技术类的日志给写起来(菜菜鸟只能写写这东西~~~高深的东西真的不会)
============******续*********================
成功的解决问题~~~~谢谢编程难 这位朋友~~~·
下面帖出整个程序的代码~~~#include <stdio.h>
#include <Windows.h>
#include <Urlmon.h>
#pragma comment (lib, "Urlmon")
char* getSelfPathName(char szBuff[], int len)
{
int i,j;
ZeroMemory(szBuff, len);
GetModuleFileNameA(NULL, szBuff, len);//取得程序自身的全路径
// 从后向前找到第一个'\'
int idx;
for ( idx = len-1; idx >= 0; --idx)
{
if ( szBuff[idx] == '\\' )
{
break;
}
}
strcpy_s(szBuff+idx+1,len-idx-1, "mma.rar");
for (i=0;i<MAX_PATH-1;i++)
{
if (*(szBuff+i)=='\\')
{
for (j=MAX_PATH-1;j>=i;j--)
{
*(szBuff+j)=*(szBuff+j-1);
}
*(szBuff+i)='\\';
i++;
}
}
return szBuff;
}
int main()
{
char *pszUrl = "http://bbs.fishc.com/forum.php?mod=attachment&aid=NDU1M3xjNGI3YmQ0OHwxMzc0MDcxNDkzfDIxMzg3NnwxNzg1NQ%3D%3D";
char cSelfPath[MAX_PATH]={0};
printf("%s",getSelfPathName(cSelfPath,MAX_PATH));
if(URLDownloadToFile(NULL, pszUrl, getSelfPathName(cSelfPath,MAX_PATH), NULL, NULL)==S_OK)
{
printf("下载成功!~~~");
}
getchar();
return 0;
}
VS2010下编译通过没有警告没有错误。。。。发帖完毕我就去面壁了~~~~我要去面壁~~~要去面壁~~~~去面壁~面壁~壁~
|