gpt4 book ai didi

c++ - 无法在继承进程中读取文件

转载 作者:行者123 更新时间:2023-11-28 00:53:22 25 4
gpt4 key购买 nike

我试图在继承进程中读取文件,我通过命令行传递的文件句柄是有效的,但是 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();
}

这里有什么问题,请帮忙:)。

最佳答案

GetFileSize 需要处理大于 4GB 的文件,因此它应该能够使用 long longint64_t 但在 Windows API 中int64_t 通常用于 32 位整数值,所以此函数返回结果的低位 32 位作为返回值,第二个参数只返回结果的高 32 位,并且您的文件小于 4GB,因此它的高位32 位顺序始终为 0。因此使用 fileSize = GetFileSize(hFile, NULL) 一切都按预期工作

关于c++ - 无法在继承进程中读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12827973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com