CreateFile=For Binary

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

CreateFile=For Binary

Сообщение Source » 22.02.2008 (Пт) 16:26

Какая комбинация флагов ф-и CreateFile соответствует оператору Open ... For Binary?
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 22.02.2008 (Пт) 21:08

Каких флагов? Флагов режима чтения у функции нет.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 22.02.2008 (Пт) 23:25

вообщем, мне надо, чтобы программа могла копировать открытые другими приложениями файлы (в большинстве случаев могла прочитать данные). Тестирую на открытом в Microsoft Word файле doc. Нужно подогнать под эту задачу 2 ф-и (нужны обе):
Код: Выделить всё
CreateFile(Path & NameFile, GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
Open Path & NameFile For Binary Access Read Shared As hFile
пока остановился на CreateFile - не может открыть, выдаёт ошибку. Far копирует открытый doc, значит, доступ есть. Или вместо CreateFile использовать OpenFile, файл-то существует. Но и CreateFile должна работать...
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 23.02.2008 (Сб) 10:34

Ты пытаешься открывая файл запретить его читать, в то время, когда он уже открыт - по этому и ошибка.
убери GENERIC_READ

+ гляди в Err.LastDllError

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 23.02.2008 (Сб) 11:35

ты хотел сказать "Запретить его писать?" Word то его открыл для записи!
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 23.02.2008 (Сб) 12:04

если файл успешно открыт для чтения, может возникнуть ошибка чтения и в каком случае?
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 23.02.2008 (Сб) 13:35

Source писал(а):надо, чтобы программа могла копировать открытые другими приложениями файлы..


Если непринципиально использование именно API, можно так:



Код: Выделить всё
Public Function LoadFileB(fFName As String) As Byte()
'Считывание файла в бинарном режиме
Dim sBody() As Byte, fn As Integer: fn = FreeFile
Open fFName For Binary Access Read As fn 'Считываем файл
    sBody = Space$(LOF(fn) / 2)
    Get fn, , sBody
Close fn
LoadFileB = sBody
Debug.Print UBound(sBody)
End Function

Public Sub SaveFileB(fFName As String, sBody() As Byte)
'Запись файла в бинарном режиме
Dim fn As Integer: fn = FreeFile
Open fFName For Binary As fn
    Put fn, , sBody
Close fn
End Sub

'Использование:

Call SaveFileB(newFName, LoadFileB(oldFName)) 'Перезапись файла

способ позволяет копировать открытый файл oldFName в newFName.

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 24.02.2008 (Вс) 8:54

Блин сам уже запутался...
Вот так должно работать:
Код: Выделить всё
h = CreateFile("c:\1.doc", GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 83

    TopList