.net - C++\CLI 中的 native winAPI

标签 .net winapi visual-c++ c++-cli

我开始了一个 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/

相关文章:

c++ - FindWindow 没有找到窗口

algorithm - 如何检测一条线是否与另一个图形重合?

c# - "Binding"到 TreeView?

c# - 通过bat文件在iis中创建应用程序池

c++ - 在 directx 9 c++ 中应用纹理时出现巨大问题

c++ - 如何在 C++17 中读取 UTF-16 文本文件

c++ - 计算 std::vector<bool> 中的设置值

.net - WCF 服务可以像 WEB API 服务一样模块化吗?

c# - 如何在更新列时暂停 DataGridView

c# - 如何在 Windows 上正确检索与扩展关联的打开命令?