Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Как проверить является ли файл файлом Excel'я


Автор: Yanis 22.9.2006, 10:06
Хочу сделать проверку файла на корректность при его открытии. Пробовал использовать функцию StgIsStorageFile, но она либо не подходит к файлам xls, либо у меня тоже руки не оттуда... 
Код
if StgIsStorageFile(PWideChar(OpenDialog1.FileName)) = S_OK then { ... }

Но результат функции у меня всегда равен $80030002 (и при открытии doc файлов тоже). Что говорит об ошибке E_NOINTERFACE...
Вобщем хотелось бы посмотреть на ваши варианты решения данной проблемы.

Автор: Damarus 22.9.2006, 10:23
Цитата(Yanis @  22.9.2006,  11:06 Найти цитируемый пост)
Но результат функции у меня всегда равен $80030002 (и при открытии doc файлов тоже). Что говорит об ошибке E_NOINTERFACE...

Нет. $80030002 - это STG_E_FILENOTFOUND:
Код
//(0x80030002L)STG_E_FILENOTFOUND
//
// MessageId: STG_E_FILENOTFOUND
//
// MessageText:
//
//  The file could not be found.
//
#define STG_E_FILENOTFOUND               ((HRESULT)0x80030002L)

Ошибка ясно показывает, что файл не найден.

Автор: Yanis 22.9.2006, 10:45
Цитата(Damarus @  22.9.2006,  11:23 Найти цитируемый пост)
Нет. $80030002 - это STG_E_FILENOTFOUND:

smile

Просто я ориентировался по этой странице: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/1992934e-9357-441a-889a-55ee4c8ba502.asp

Добавлено @ 10:46 
Да и к тому же как файл может быть не найден, если excel его открывает корректно. smile 

Автор: Damarus 22.9.2006, 10:53
Цитата(Yanis @  22.9.2006,  11:45 Найти цитируемый пост)
Просто я ориентировался по этой странице: http://msdn.microsoft.com/library/default....5ee4c8ba502.asp

Ну правильно:
Цитата
E_NOINTERFACE  0x80004002  The QueryInterface method did not recognize the requested interface. The interface is not supported.


Цитата(Yanis @  22.9.2006,  11:45 Найти цитируемый пост)
Да и к тому же как файл может быть не найден, если excel его открывает корректно.

Я плохо разбираюсь в Delphi, но возможно причина в том, что в OpenDialog1.FileName находится ANSI строка, а StgIsStorageFile требует UNICODE (PWideChar - это вроде приведение типа, как (LPWSTR)OpenDialog1.FileName в C).
Извините если не прав.

Автор: Yanis 22.9.2006, 10:56
Цитата(Damarus @  22.9.2006,  11:53 Найти цитируемый пост)
Извините если не прав. 

Не исключено, что неправ я smile

Цитата(Damarus @  22.9.2006,  11:53 Найти цитируемый пост)
это вроде приведение типа, вроде (LPWSTR)OpenDialog1.FileName в C).

Вот как выглядит приведение типов в Delphi:
Цитата(Yanis @  22.9.2006,  11:06 Найти цитируемый пост)
PWideChar(OpenDialog1.FileName)


Добавлено @ 10:58 
Я добавил в OpenDialog маску на *.xls файлы, но всё равно хочу сделать проверку программно.

Автор: Damarus 23.9.2006, 09:19
Yanis, а что с кодировкой строки в OpenDialog1.FileName (ANSI/UNICODE)? Возможно стоит попробовать что то вроде MultiByteToWideChar? Или здесь:
Код
PWideChar(OpenDialog1.FileName)

ANSI-строка автоматически преобразуется в UNICODE?

Автор: Yanis 25.9.2006, 11:20
Damarus
Действительно, ты оказался прав с самого начала. 
Нужно было непосредственно конвертировать строку в Wide. Спасибо. Образовалась вот такая функция для проверки является ли файл структурированным хранилищем:
Код
//==============================================================================
// Функция возвращает True, если файл FileName является
// файлом структурированного хранилища (Structured Storage).
// В любых других ситуациях False
//==============================================================================
function IsStorageFile(const FileName: string): Boolean;
var
  wsFn: PWideChar;
  dwStrLen: DWORD;
begin
  Result := False;
  dwStrLen := Length(FileName);
  if dwStrLen > 0 then
    begin
      wsFn := GetMemory(dwStrLen * SizeOf(WideChar) + 1);
      StringToWideChar(FileName, wsFn, dwStrLen + 1);
      Result := StgIsStorageFile(wsFn) = 0; // S_OK = 0
      FreeMemory(wsFn);
    end;
end;

Может быть кому-нибудь понадобится.

Damarus, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)