|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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下编译通过没有警告没有错误。。。。发帖完毕我就去面壁了~~~~我要去面壁~~~要去面壁~~~~去面壁~面壁~壁~
|
|