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

| 我使用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
。但是以为您的“ 4”通话失败了。
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();
    
GetFileSize函数正在重现错误值。   请注意,如果返回值为   INVALID_FILE_SIZE(0xffffffff),   应用程序必须调用GetLastError来   确定函数是否具有   成功或失败。 请参阅MSDN上的API文档。 顺便说一句,我认为@David Heffernan在这里有要点。     

要回复问题请先登录注册