.net C++\CLI中的本机winAPI

.net C++\CLI中的本机winAPI,.net,winapi,visual-c++,c++-cli,.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).ToPoint

我用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()

GetFileSize函数正在返回错误值

请注意,如果返回值为 无效的\u文件\u大小0xffffffff,一个 应用程序必须调用GetLastError以 确定函数是否具有 成功或失败

顺便说一句,我认为@David Heffernan在这里有一个观点。

建议使用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类用于.net 4.0中引入的内存映射文件不是更容易吗?是的,但我已经在.net 4.0之前编写了它,顺便问一下,如果我使用.net类会比本机api更快吗?获取工作代码会更快!;-我希望性能上不会有什么差别。@DavidHeffernan:hi,实际上性能上有很大差别:在我的机器上,使用托管内存映射文件类比使用本机API慢31倍!我使用C++/CLI以及指向映射视图的不安全C指针来衡量这一点,它们都一样快。这只是对未来读者的一个警告,问题断言它假设的代码存在内存泄漏,没有类型安全性。如我的回答所示,我强烈建议使用PtrToStringChars而不是Marshal类来访问文件名。