Родной winAPI в C ++ \ CLI - PullRequest
       3

Родной winAPI в C ++ \ CLI

2 голосов
/ 16 апреля 2011

Я запустил новый проект с типом приложения Windows Forms и поместил два текстовых поля (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 для всех файлов!

Edit:

Спасибо, ребята, я решил проблему. Это было в первом параметре CreateFile, это должно быть:

(LPCWSTR)Marshal::StringToHGlobalUni(this->textBox1->Text).ToPointer()

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

Рекомендуется использовать GetFileSizeEx вместо GetFileSize.Но подумайте, что ваш CreateFile вызов не удался.

CreateFile не принимает HGLOBAL.И вы конвертируете строку в ANSI, а затем передаете ее в Unicode-версию CreateFile, которая также не работает.

Просто оставайтесь в 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();
2 голосов
/ 16 апреля 2011

Функция GetFileSize возвращает значение ошибки.

Обратите внимание, что если возвращаемое значение равно INVALID_FILE_SIZE (0xffffffff), приложение должно вызвать GetLastError, чтобы определить, была ли функция выполнена успешно или нет.

См. API-документы по MSDN .

Кстати, я думаю, что у @David Heffernan есть смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...