无法在继承进程中读取文件
Posted
技术标签:
【中文标题】无法在继承进程中读取文件【英文标题】:Can't read file in inherited process 【发布时间】:2012-10-10 20:39:16 【问题描述】:我正在尝试在继承进程中读取文件,我通过命令行传递的文件句柄是有效的,但GetFileSize(HANDLE,LPDWORD)
返回0
。
#include"mainClass.h"
MainClass* MainClass::ptr = NULL;
MainClass::MainClass()
ptr = this;
BOOL CALLBACK MainClass::DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
switch(uMsg)
HANDLE_MSG(hwnd,WM_CLOSE,ptr->OnClose);
HANDLE_MSG(hwnd,WM_COMMAND,ptr->OnCommand);
HANDLE_MSG(hwnd,WM_INITDIALOG,ptr->OnInitDialog);
return false;
BOOL MainClass::OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
SECURITY_ATTRIBUTES sa = sizeof(SECURITY_ATTRIBUTES),0,true;
hFile = CreateFile(_T("D:/mutex.txt"),GENERIC_READ,0,&sa,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
return true;
void MainClass::OnClose(HWND hwnd)
DestroyWindow(hwnd);
PostQuitMessage(0);
void MainClass::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
if(codeNotify == BN_CLICKED)
if(id == IDC_BUTTON_READ_ENCRYPT)
TCHAR* cmd = new TCHAR[100];
_stprintf(cmd,_T("readFromFile.exe %d"),(int)hFile);
STARTUPINFO si = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi = 0;
if(CreateProcess(NULL,cmd,NULL,NULL,true,NULL,NULL,NULL,&si,&pi))
//CloseHandle(hFile);
//CloseHandle(pi.hThread);
//CloseHandle(pi.hProcess);
delete[]cmd;
继承进程是控制台应用程序:
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<tchar.h>
PTSTR buf;
HANDLE hFile;
void main()
int s = 100;
buf = new TCHAR[s];
TCHAR* temp = buf;
_tcscpy(buf,GetCommandLine());
while(*buf++ != _T(' '));
hFile = (HANDLE)_ttoi(buf);
_tprintf(_T("%d\n"),(int)hFile);
getch();
buf = temp;
delete[]buf;
if(hFile == INVALID_HANDLE_VALUE)
MessageBox(NULL,_T("file handle invalid"),_T("Error"),NULL);
return;
DWORD fileSize;
GetFileSize(hFile,&fileSize);
_tprintf(_T("%d\n"),(int)fileSize);
getch();
if(!fileSize)
MessageBox(NULL,_T("file is empty"),_T(""),NULL);
return;
buf = new TCHAR[fileSize/sizeof(TCHAR)+1];
DWORD wasRead;
ReadFile(hFile,buf,fileSize,&wasRead,NULL);
_tprintf(buf);
if(buf)
delete[]buf;
getch();
这里有什么问题,请帮忙:)。
【问题讨论】:
【参考方案1】:GetFileSize
需要处理大于 4GB 的文件,因此它应该能够与 long long
或 int64_t
一起使用,但在 windows API 中 int64_t
通常用于 32 位整数值,因此此函数返回低将结果的 32 位作为返回值排序,第二个参数中只有结果的高 32 位,并且您的文件小于 4GB,因此其高 32 位始终为 0。所以使用fileSize = GetFileSize(hFile, NULL)
,一切都按预期工作
【讨论】:
以上是关于无法在继承进程中读取文件的主要内容,如果未能解决你的问题,请参考以下文章