能力值:
( LV3,RANK:30 )
|
-
-
2 楼
你的代码有释放内存么?
到最后你申请的内存都还在啊。
我帮你实验过了,新修改的代码如下:
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hCreateFile = NULL;
DWORD dwFileLength = 0;
HANDLE hWriteFile = NULL;
DWORD dwRead = 0;
int nError = 0;
hCreateFile = CreateFile("M:\\1.exe",GENERIC_ALL,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);//我的磁盘比较另类,呵呵
if(NULL == hCreateFile)
{
printf("无法打开文件!\n");
return GetLastError();
}
dwFileLength = GetFileSize(hCreateFile, NULL);
if(0 == dwFileLength)
{
printf("获取文件大小失败!\n");
CloseHandle(hCreateFile);
return GetLastError();
}
//LPVOID FileBuf = VirtualAlloc(NULL,dwFileLength+1,MEM_COMMIT,PAGE_READWRITE);
char *FileBuf = new char[dwFileLength+1];
//printf("0x%x\n",FileBuf);
if(NULL == FileBuf)
{
printf("内存分配失败!\n");
CloseHandle(hCreateFile);
return 1;
}
if(ReadFile(hCreateFile,FileBuf,dwFileLength,&dwRead,0))
{
printf("读取文件成功\n\n");
printf("%d\n\n",dwRead);
}
else
{
printf("读取文件失败\n\n");
printf("%d\n\n",dwRead);
nError = GetLastError();
printf("%d\n",nError);
}
CloseHandle(hCreateFile);
hCreateFile = NULL;
hWriteFile = CreateFile("M:\\bingle.exe", GENERIC_ALL, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);//我的磁盘是M盘,而且你的第5个参数不对
if(NULL == hWriteFile)
{
printf("创建文件失败!\n");
return GetLastError();
}
if(WriteFile(hWriteFile, FileBuf, dwFileLength, &dwRead, NULL))
{
printf("文件写入成功\n\n");
nError = GetLastError();
printf("%d\n\n",nError);
printf("%d\n",dwRead);
}
else
{
printf("文件写入失败\n\n");
}
delete []FileBuf;
FileBuf = NULL;
CloseHandle(hWriteFile);
hWriteFile = NULL;
return 0;
}
以上代码在VS2003上编译通过
用new很难失败的,我怀疑是你的其他的函数失败。
不过老实说,你这个方法并不好,也只适用程序小一点的,比如说,超过10G你还能申请那么多内存?
用内存映射文件吧!
|
能力值:
( LV11,RANK:190 )
|
-
-
3 楼
为什么不对呀,确实如你所说,我没有释放内存。那个CreateFile是用来打开文件,不是创建文件。我给出的代码可以争取执行的。你可能没明白我的意思。我说失败的是用new申请内存额呵呵
|
能力值:
( LV11,RANK:190 )
|
-
-
4 楼
[QUOTE=wangma;881495]你的代码有释放内存么?
到最后你申请的内存都还在啊。
我帮你实验过了,新修改的代码如下:
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
...[/QUOTE]
CreateFile是用来打开文件的,给出的代码可以编译通过。我可能没给出解释:1.exe是要copy的文件,0k的bingle。exe是用来写入的文件。那个申请内存VirtualAlloc是成功 的,但是new申请的时候就失败!我调试过了,new返回的指针式null。还有我确实忘了释放内存 额呵呵
|
能力值:
( LV11,RANK:190 )
|
-
-
5 楼
刚才有只把VirtualAlloc 改回new了,执行竟然成功了,很诡异呀,昨天就是编译通过,运行失败。看来是程序也是看心气的,我心气好了 他也好 哇咔咔
|
能力值:
( LV3,RANK:30 )
|
-
-
6 楼
我知道你那个程序的意思
但是由于你没有贴出来用new的版本
我只能按照你说思路去改
之后发现没有出现new分配失败的情况
而且很怀疑是你打开写入文件时候的情况
因为你使用的标志是把文件长度设置为0
我没有试验过,不知道这样对于没有新建的文件能创建成功不?
还有啊
为什么不在程序使用判断而要使用调试的办法去确定new的数值?
而且使用C函数的方式来做会很容易,你这个程序是基于控制台的,但是还调用API,实在很麻烦。
|