我开始了一个 Windows 窗体应用程序类型的新项目,我放置了两个文本框(textbox1 和 textbox2)和一个按钮。我使用 OpenFileDialog 从系统中选择一个文件并将其路径放入 textbox1 中,我为按钮添加了以下代码:
HANDLE hFile;
HANDLE hMap ;
LPVOID base;
hFile = ::CreateFile((LPCWSTR)Marshal::StringToHGlobalAnsi(this->textBox1->Text).ToPointer(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING , FILE_FLAG_SEQUENTIAL_SCAN, 0);
unsigned long sifi= ::GetFileSize(hFile,NULL);
if(hFile !=INVALID_HANDLE_VALUE){
hMap= ::CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0);//create Mem mapping for the file in virtual memory
}
if( hMap!=NULL){
base = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);//load the mapped file into the RAM
}
this->textBox2->Text=sifi.ToString();
我尝试使用该代码执行的是从 textbox1 读取文件路径以使用它打开文件句柄,然后获取文件的大小并将其放入 textbox2 中。现在的问题是,textbox2 显示的文件大小值不正确。所有文件似乎总是 4294967295!
编辑:
谢谢各位,问题已经解决了。它位于 CreateFile 的第一个参数中,它应该是:
(LPCWSTR)Marshal::StringToHGlobalUni(this->textBox1->Text).ToPointer()
最佳答案
建议使用GetFileSizeEx
而不是GetFileSize
。但认为您的 CreateFile
调用失败了。
CreateFile
不接受 HGLOBAL
。您将字符串转换为 ANSI,然后将其传递给 CreateFile
的 Unicode 版本,这也已损坏。
只需保留 Unicode,如下所示:
pin_ptr<wchar_t> wszFilename = PtrToStringChars(textBox1->Text);
HANDLE hFile = ::CreateFileW(wszFilename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING , FILE_FLAG_SEQUENTIAL_SCAN, 0);
if (hFile == 0 || hFile == INVALID_HANDLE_VALUE) throw gcnew Win32Exception();
关于.net - C++\CLI 中的 native winAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5683085/