#vb6 #filenames #createfile #working-directory
#vb6 #имена файлов #createfile #working-directory
Вопрос:
Я устранял проблему, из-за которой CreateFile не мог открыть существующий именованный канал, когда обнаружил, что CreateFile () плохо работает с параметром filename. Мой код:
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileW" ( _
ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, _
ByVal lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) As Long
pipeHandle = CreateFile("C:\test.txt", GENERIC_READ Or GENERIC_WRITE, 0amp;, 0amp;, CREATE_ALWAYS, 0amp;, 0amp;)
Он не создает файл в C: , вместо этого он создает файл в текущем рабочем каталоге VB с искаженным именем файла. Кажется, CreateFile не может распознать и проанализировать заданную строку имени файла.
Почему это происходит? Я использую VB6 в Windows 7 (использовал некоторый трюк для его установки). Может ли это быть причиной проблемы?
Комментарии:
1. Почему два \ в имени файла? Скорее всего, ваша проблема связана с этим. Вы не можете просто скопировать / вставить примеры, вам нужно знать, что происходит. Например, не экранируется в VB6, хотя он есть во многих языках с фигурными скобками.
2. \ действительно является одной из проблем. Я не знал, что VB6 не экранирует , поэтому я размышлял о правильности «\. pipe testpipe». Теперь основной проблемой оказался unicode / ansi. Я попробовал CreateFileA, и это сработало. Спасибо за вашу информацию.
3. @Charlie : если ответ вам помог, не забудьте принять его как ответ и, возможно, проголосовать за! (в вашем профиле указано, что вы не поддержали ни одного ответа, несмотря на то, что задали 9 вопросов)
4. @Митч, я всегда хотел проголосовать, чтобы уведомить, что проблема решена, и поблагодарить за помощь, но там всегда говорилось, что для голосования мне нужна репутация 15. Вот почему я не смог.
5. @Charlie: np . Я поддержал этот вопрос, так что ваш немного ближе!
Ответ №1:
Прошло много времени, но я думаю, что это из-за ansi / unicode. Попробуйте CreateFileA
функцию и посмотрите, что получится. (Кроме того, IIRC, вы не экранируете …. хотя, опять же, прошло около 7 лет с тех пор, как я серьезно кодировал с VB6.)
Комментарии:
1. Большое спасибо @MJB. CreateFileA сработал. Теперь я знаю, что, хотя строка VB6 является unicode, она преобразует строки в ANSI при передаче параметров.
2. Теперь обратите внимание, что есть способ заставить CreateFileW работать…. Я помню, что делал это, и, возможно, кто-то еще подключится. Однако, если ansi достаточно хорош для вашего приложения, отлично.
3. Примечание: Я просмотрел его, и если filename объявлено как long и вы передаете StrPtr (yourStringFilename) в качестве этого параметра, CreateFileW тоже может сработать.