Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проверить является ли файл файлом Excel'я, А то у пользователей руки не оттуда :) 
:(
    Опции темы
Yanis
Дата 22.9.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 3
Всего: 111



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

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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Damarus
Дата 22.9.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 1
Всего: 29



Цитата(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)

Ошибка ясно показывает, что файл не найден.
PM MAIL ICQ Jabber   Вверх
Yanis
Дата 22.9.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 3
Всего: 111



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

smile

Просто я ориентировался по этой странице: http://msdn.microsoft.com/library/default....5ee4c8ba502.asp

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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Damarus
Дата 22.9.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 1
Всего: 29



Цитата(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).
Извините если не прав.

Это сообщение отредактировал(а) Damarus - 22.9.2006, 10:54
PM MAIL ICQ Jabber   Вверх
Yanis
Дата 22.9.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 3
Всего: 111



Цитата(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 файлы, но всё равно хочу сделать проверку программно.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Damarus
Дата 23.9.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 1
Всего: 29



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

ANSI-строка автоматически преобразуется в UNICODE?
PM MAIL ICQ Jabber   Вверх
Yanis
Дата 25.9.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 3
Всего: 111



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, спасибо!


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.