Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2011, 01:19   #1
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию Однако Мистика.

Открывал фаил с статистическим путём. Ну захотелось привинтить Opendialog для удобства.

Код:
begin
if OpenDialog1.Execute then Fname:= OpenDialog1.FileName;
end;
Имя считываю всё норм а при выполнении функции
Код:
  hWav := OpenFile(PansiChar(Fname), WAVOFStruct, OF_READWRITE);
  if hWav = HFILE_ERROR then RaiseLastWin32Error; тут генерируется исключение, почему непонятно
так например работает нормально
Код:
  Path =  'C:\Documents and Settings\DreamWolf\Мои документы\Моя музыка\file.wav' ;
hWav := OpenFile(PansiChar(Path), WAVOFStruct, OF_READWRITE);
Я даже чекбокс поставл в котором отображается
Код:
 CheckBox1.Checked := (Fname = Path);
чекбокс отмечается но почемуже тогда после прохождения
Код:
 hWav := OpenFile(PansiChar(Fname), WAVOFStruct, OF_READWRITE);
 if hWav = HFILE_ERROR then RaiseLastWin32Error;
Всёравно генерируется ошибка?

Последний раз редактировалось Stilet; 15.01.2011 в 11:40.
vsrmis вне форума Ответить с цитированием
Старый 15.01.2011, 01:28   #2
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию

Может файл не доступен для OF_READWRITE?
Правильно заданный вопрос - половина ответа!
XeruH вне форума Ответить с цитированием
Старый 15.01.2011, 02:10   #3
Eminem
Пользователь
 
Регистрация: 08.02.2010
Сообщений: 64
По умолчанию

vsrmis
1. А переменную Fname Вы объявляете как глобальную или локальную.
2. Fname в программе может где-то ещё изменяется.
3. Я надеюсь Fname типа String.
Eminem вне форума Ответить с цитированием
Старый 15.01.2011, 16:18   #4
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Eminem дело говорит.
Поставьте бряку на строку
Код:
hWav := OpenFile(PansiChar(Fname), WAVOFStruct, OF_READWRITE);
и при останове проверьте значение Fname.
asmodey1 вне форума Ответить с цитированием
Старый 16.01.2011, 11:26   #5
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию

Fname стринговская глобальная, более нигде не изменяется, с отладкой делал, вроде всё правильно, даже как говорил выше програмно с помошью чекбокса сверял её с Path. Сейчас кину код всей программы.
vsrmis вне форума Ответить с цитированием
Старый 18.01.2011, 14:29   #6
Eminem
Пользователь
 
Регистрация: 08.02.2010
Сообщений: 64
По умолчанию

Тогда действительно мистика..... Я тут вот что ещё хотел уточнить, обратите внимание.
Два адреса (к примеру):
Код:
'C:\Documents and Settings\DreamWolf\Мои документы\Моя музыка\file.wav' ;
и
Код:
'C:\DreamWolf\file.wav' ;
В чём разница, по мимо самого пути? - а то, что во втором нет пробелов!

Переместите ВаВ-файл директорию без пробелов. На моей практике встречалось такое, что система не понимает этого пробела и в итоге путь становился таким:
Код:
'C:\Documents ';
И по этому файл не найден.

Решение - обрамление пути в кавычки, т.е.:
Код:
"'C:\Documents and Settings\DreamWolf\Мои документы\Моя музыка\file.wav'"
Другими словами, попробуйте сделать так:
Код:
hWav := OpenFile(PansiChar('"'+Fname'"'), WAVOFStruct, OF_READWRITE);
Согласен, выглядит глупо, но это просто эксперимент.

Далее, я использую не PansiChar, Pchar - не знаю точно в чём разница, но не встречал подобных запарок.

____________
P.S. а файл "file.wav" ни чем не занят?
Дело в том, что параметр "OF_READWRITE" открывает файл на чтение, но и на запись и если файл занят другим приложением или файл уже открыт на запись, то при повторном открытии будет ошибка, правда IO

Последний раз редактировалось Eminem; 18.01.2011 в 14:35.
Eminem вне форума Ответить с цитированием
Старый 18.01.2011, 16:59   #7
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Может, будем лучше использовать QuotedStr ?
Чтоб в кавычках и апострофах не запутаться...
asmodey1 вне форума Ответить с цитированием
Старый 18.01.2011, 17:06   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
тут генерируется исключение, почему непонятно
Читать сообщение об ошибке не пробовали? Говорят помогает.

Цитата:
OpenFile(PansiChar(Fname), WAVOFStruct, OF_READWRITE)
Почему PAnsiChar, если FName у вас String, а не AnsiString.

Какая версия Delphi? Кто такой OpenFile? Какой у него прототип?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.01.2011, 23:15   #9
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию

Использую PAnsiChar так как Pchar выдаёт ошибку несоответствия типов
PwideChar и Pansichar.
Компилирую на Делфи XE 2011.
Openfile - стандартная функция открытия файла (из Юнита Windows)

вот код если можете скомпилируйте у себя может у вас что-то буудет? или в чём дело?
PHP код:
unit Shifpr;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrls;

type
  TForm1 
= class(TForm)
    
Button1TButton;
    
OpenDialog1TOpenDialog;
    
CheckBox1TCheckBox;
    
procedure Button1Click(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(SenderTObject);
const
Path 'C:\wav.wav' ;
NEwPath 'C:\wav2.wav' ;
var
  
WAVFile: array of Byte;
  
WAVOFStructTOFStruct;
  
hWavhModTHandle;
  
WavSizeInteger;
  
BytesReadBytesWriteDWORD;
  
X,integer;
  
Fname string;

begin
  
if OpenDialog1.Execute then Fname:= OpenDialog1.FileName;
  if 
Path=Fname then CheckBox1.Checked := True;

  
ZeroMemory(@WAVOFStructSizeOf(WAVOFStruct));
  
hWav := OpenFile(Pansichar(Fname), WAVOFStructOF_READWRITE);
  if 
hWav HFILE_ERROR then RaiseLastWin32Error;
  try
    
WavSize := GetFileSize(hWavnil);
    
SetLength(WAVFileWavSize);
    
ReadFile(hWavWAVFile[0], WavSizeBytesReadnil);
    
:= WavFilE[58] ;
    for 
:= 58 to Wavsize do WavFilE[x] := WavFilE[x+1]; // изменяю только 4 бита и фаил после этого не проигрывается
    
x:= wavsize;
    while 
X<>58 do begin
    WavFilE
[x] := WavFilE[x-1];
    
x:= X-1;
    
end;
    
WavFilE[58] := X;
    
hMod := CreateFile(NewPathGENERIC_WRITE0nilCREATE_ALWAYS00);
    if 
hMod INVALID_HANDLE_VALUE then RaiseLastWin32Error;
    try
      
WriteFile(hModWAVFile[0], WavSizeBytesWritenil);
    finally
      
CloseHandle(hMod);
    
end;
  finally
    
_lclose(hWav);
  
end;
end;

end
Да а ошибку мне выдаёт
System Error/ Code : 2 не удаётся найти указаный фаил.
vsrmis вне форума Ответить с цитированием
Старый 18.01.2011, 23:26   #10
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию

Фаил ничем не открыт, если применить.
пробовал так
Fname:= 'C:\wav.wav' ;
if Path=Fname then CheckBox1.Checked := True;

ZeroMemory(@WAVOFStruct, SizeOf(WAVOFStruct));
hWav := OpenFile(Pansichar(Fname), WAVOFStruct, OF_READWRITE);
if hWav = HFILE_ERROR then RaiseLastWin32Error;

Результат анологичен. Тоесть если Fname - стринговая переменная то вё плохо, если же обыкновенная константа , то всё хорошо.
vsrmis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мистика?!!! SNUPY Свободное общение 9 09.06.2010 13:55
Мистика с USB, мышью, компьютером Rembo Компьютерное железо 6 28.02.2009 17:49
Отладка dll с хуком или Мистика на марше Tihon Win Api 8 02.01.2009 13:55
Задачка однако! Nixtone Помощь студентам 8 15.11.2007 17:27
мистика в delphi steck Общие вопросы Delphi 4 27.03.2007 23:57