Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / На win x64 файл не хочет копироваться в буквально system32 / 9 сообщений из 9, страница 1 из 1
04.06.2009, 17:26
    #36026238
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
Подчеркну, что система X64!!!
1)Находим системную директорию:
Код: plaintext
1.
Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Возвращает: SystemDirectory: D:\WINDOWS\system32\
OK, в данном случае годится.
2) Копируем туда dll (драйвер монитора принтера).
Код: plaintext
1.
2.
3.
4.
    If X64System Then 'x64-драйвер монитора monitor64.dll
        res = CopyFile(InstallPath & "monitor64.dll", SystemDirectory & "monitor64.dll", False)
'....
Public Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" _
 (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long

Скопировалось, но... в SysWOW64
Все бы ничего, только дальше, вызывая
3)
Код: plaintext
1.
Public Declare Function AddMonitor Lib "winspool.drv" Alias "AddMonitorA" _
(ByVal pName As String, ByVal level As Long, pMonitors As Any) As Long
получаем: AddMonitor... Failed. Error code: 126 (The specified module could not be found.)
Дело в том что dll-ка 64-битная (похоже на то!) но по задумке ее вызов при установке монитора должен осуществляться именно из system32, иначе failed.
Как правило эти "фокусы" виндов идут на руку, напр.чтобы не переписывать инсталлятор, но в данном случае просто вредно для здоровья.
Есть идеи?
...
Рейтинг: 0 / 0
04.06.2009, 17:30
    #36026252
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
Добавить в переменную path путь к SysWOW64?
А вообще, какие значения передаются в AddMonitor?
...
Рейтинг: 0 / 0
04.06.2009, 17:48
    #36026292
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
Не, добавлять в path путь к SysWOW64, в лучшем случае это не даст ничего, в худшем еще нарушит идеологию 64-х битных виндов.
Но файл "monitor64.dll" точно должен оказаться именно в system32 так как я ее пишу по буквам, а не так как винды себе на уме решают.

Вот код, м.б. действительно можно оставить dll-ку в sys...64 и что-нибудь придумать в PrinterMonitor чтоб схватывало, но точно говорю:задумано, чтобы она оказалась в system32!


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Public Function PrinterMonitor(InstallTyp As eInstall) As Long
    Dim res As Long, Monitor2 As MONITOR_INFO_2, tStr As String
    Select Case InstallTyp
        Case  0 : ' Install
            With Monitor2
                .pName = MonitorName & Chr$( 0 )
                .pEnvironment = "" & Chr$( 0 )
                If X64System Then
                    .pDLLName = "monitor64.dll" & Chr$( 0 )
                Else
                    .pDLLName = "monitor.dll" & Chr$( 0 )
                End If
            End With
            res = AddMonitor(vbNullString,  2 , Monitor2)
            If res <>  0  Then
                AddLog "  Calling AddMonitor... Done."
            Else
                AddLog "  Calling AddMonitor... Failed. Error code: " & RaiseAPIError
            End If
            PrinterMonitor = res
            Exit Function
        Case  1 : ' UnInstall
            res = DeleteMonitor(vbNullString, vbNullString, MonitorName & vbNullString)
            If res <>  0  Then
                AddLog "  Calling DeleteMonitor... Done."
            Else
                AddLog "  Calling DeleteMonitor... Failed. Error code: " & RaiseAPIError
            End If
            PrinterMonitor = res
            Exit Function
        End Select
End Function
'...
Private Type MONITOR_INFO_2
 pName As String
 pEnvironment As String
 pDLLName As String
End Type

...
Рейтинг: 0 / 0
04.06.2009, 17:53
    #36026306
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
А если прописать в .pDLLName полный путь?
...
Рейтинг: 0 / 0
04.06.2009, 17:54
    #36026308
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
Скажем так, если "monitor64.dll" положить туда, т.е. в system32 "ручками", то ошибки не возникает.
...
Рейтинг: 0 / 0
04.06.2009, 18:01
    #36026331
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
>>А если прописать в .pDLLName полный путь?

Попробую сейчас ,конечно, уже подумал не вопрос

Но вопрос-то даже не в этом, он более глобальный. Что не существует способа залезть в system32 из программы что-ли. М.б. какие дополнительные API ? Не может же такого быть что нельзя. Понятно что винды "умничают" в расчете "на дурака", но если НАДО .
...
Рейтинг: 0 / 0
04.06.2009, 18:12
    #36026352
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
> Автор: Дмитрий77
> Скажем так, если "monitor64.dll" положить туда, т.е. в system32 "ручками", то ошибки не возникает.

А почему такое настойчивое желание положить именно в system32 ? Я прочитал, что так работает, но по другому не работает
именно из-за некорректной установки. Ведь название говорит что это для 32-х разрядного хлама. МС поменял всю идеологию
размещения программ на 64-х разрядах и мне кажется имеет смысл понять что и куда теперь нужно устанавливать. Да и
например последний ран-тайм настойчиво рекомендуют устанавливать, а не копировать, как это можно было раньше.

З.Ы. Это просто мысли вслух, помочь не на чем
З.Ы.Ы. MSDN Все, что нужно знать, чтобы начать
программировать для 64-разрядных версий Windows



Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
04.06.2009, 18:42
    #36026405
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
To Antonariy:
Вот так не схватывает
Код: plaintext
1.
                If X64System Then
                    '.pDLLName = SystemDirectory & "monitor64.dll" & Chr$( 0 )
А вот так схватывает на ура и устанавливает:
Код: plaintext
1.
               If X64System Then
                    .pDLLName = WindowsDirectory & "sysWOW64\monitor64.dll" & Chr$( 0 )

Получить WindowsDirectory & "sysWOW64" независимо от виндовских игр для меня как бы не проблема, я этот вопрос проработал уже:
http://sql.ru/forum/actualthread.aspx?tid=668385
Код: plaintext
1.
Private Declare Function GetSystemWow64Directory Lib "Kernel32.dll" _
Alias "GetSystemWow64DirectoryA" (ByVal lpBuffer As String, ByVal uSize As Long) As Long

Но получается что:
1) CopyFile подменяет истинное название SystemDirectory
2) А вот AddMonitor честно глядит в сторону родной старой System32

To Игорь:
>>А почему такое настойчивое желание положить именно в system32 ?
А это не моя прихоть, принтер то не мой, не дорос я еще принтеры писать,
а вот устанавливать программно очень даже научился.
А вот ну как этот монитор сейчас "печатать не будет" (потому что лежит не там где задумано, кто его знает почему его в 32 пихнули, он ведь точно 64bit, м.б. сдуру, а м.б. умышленно, сделали просто "чтоб боботало"), проще его туда же и пихнуть и не париться, чем разбираться в рекомендациях.

Хотя конечно надо! Надо! Почитаю обязательно..

Т.е. я бы все-таки вернулся к вопросу: как скопировать именно в system32?
...
Рейтинг: 0 / 0
04.06.2009, 19:20
    #36026448
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На win x64 файл не хочет копироваться в буквально system32
Поигрался еще, вроде все корректно работает, печатает.
Т.е. ну пусть живет в sys...64.
Единственное, думаю тогда уж делать
res = CopyFile(InstallPath & "monitor64.dll", SystemWow64Directory & "monitor64.dll", False)
используя
Код: plaintext
1.
Private Declare Function GetSystemWow64Directory Lib "Kernel32.dll" _
Alias "GetSystemWow64DirectoryA" (ByVal lpBuffer As String, ByVal uSize As Long) As Long
чтоб уж точно в sys...64
Не то что не доверяю, а так как-то спокойнее, а то вдруг еще подведет при других региональных настройках, мало чего...

Гм, а вопрос таки остается...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / На win x64 файл не хочет копироваться в буквально system32 / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]