Проблемы с переносимостью

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

Проблемы с переносимостью

Сообщение Александр Андреев » 30.05.2003 (Пт) 12:56

Делаю exe-шник под Win2000. Все работает.
Затем запускаю его под NT 4.0 т все валится. Ругается программа в API-функции GetClassName, которая определена вот так:

Код: Выделить всё
Declare Function GetClassName Lib "user32" _
Alias "GetClassNameA" (ByVal hwnd As Long, _
                       ByVal lpClassName As String, _
                       ByVal nMaxCount As Long) As Long

и находится в user32.dll.

Может кто знает как с этим бороться? Или по-крайней мере подскажите в какую сторону копать...

Vitaliy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 14.05.2003 (Ср) 13:35

Сообщение Vitaliy » 30.05.2003 (Пт) 14:54

В качестве информации для размышления:
А Вы свою (из WIN2000) DLL-ку на NT переносите? Попробуйте перенести и зарегистрировать, сохранив на всякий случай старую.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 30.05.2003 (Пт) 15:30

Это не подойдет :(
Похоже на взлом системы, мне этим не дадут заниматься.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 31.05.2003 (Сб) 9:58

Что за ошибка?

может GetClassNameW или просто GetClassName ? Посмотри Депендсом дллку.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 31.05.2003 (Сб) 10:07

GetClassNameA, т.к. VB не может декларировать просто GetClassName. NT при упомянутой ошибке пишет здоровенный log, в котором все подробно излагает.
Есть еще одна проблема - ошибка 429 'ActiveX component can't create object'. Подобная проблема возникала у меня и на 2000, когда я пытался подключить какие-нибудь левые ocx-ы. Такое чувство, что они разрабатываются для специфической операционки.

Мои коллеги смогли решить эти проблемы простой перекомпиляцией проекта под NT. Но в моем случае это не пройдет, т.к. моя прилага обязана работать как на NT так и на 2000. А что для этого делать - не пойму пока...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 31.05.2003 (Сб) 10:31

Ну, так проверяй версию системы и вперёд!

Declare Function GetClassNameNT Lib "user32" _
Alias "GetClassNameA" (ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long

Declare Function GetClassName2K Lib "user32" _
Alias "GetClassNameX" (ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.05.2003 (Сб) 12:56

Функция называется одинаково, просто в NT-системах большинство API-функций имеет два варианта реализации, с окончанием "A" для ANSI-варианта, и с окончанием "W" для Unicode-варианта.
Скорее всего ты не преобразовывал строку из Unicode в ANSI (StrConv(Var, vbFromUnicode)), когда передавал аргумент в функцию.
Попробуй делать так:
Декларация:
Код: Выделить всё
Declare Function GetClassName Lib "user32" _
Alias "GetClassNameA" (ByVal hWnd As Long, _
                       ByVal lpClassName As Long, _
                       ByVal nMaxCount As Long) As Long

Использование:
Код: Выделить всё
Dim CName As String, ret As Long
...
CName = Space$(1024)
ret = GetClassName(Me.hWnd, StrPtr(CName), Len(CName))

StrPtr (или PtrStr, не помню точно), это указатель на строку, правда это недокументированная и неподдерживаемая функция. В крайнем случае для получения указателя используй GlobalAlloc и GlobalLock.
Lasciate ogni speranza, voi ch'entrate.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 31.05.2003 (Сб) 14:28

Ок, спасибо, я попробую.
Тут еще обнаружилось, что эта ошибка плавает. Сейчас, например, я ее никак не могу получить :o

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 02.06.2003 (Пн) 13:21

В общем, GetClassName я вообще исключил из программы, без него обхожусь.
Проблема с созданием ActiveX контрола возникает в следующем коде:
Код: Выделить всё
Dim fso As FileSystemObject
Set fso = New FileSystemObject

Сам fso располагается в библиотеке scrrun.dll, она под NT есть. Попытки переписать эту библиотеку из Win2000 тоже ничего не дали.
Что мне с этим делать, подскажите :?: :!:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 02.06.2003 (Пн) 13:36

Может, просто

Код: Выделить всё
Set obj = createobject("Scripting.Filesystemobject")

boevik
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 23.07.2002 (Вт) 11:44
Откуда: Israel

Сообщение boevik » 02.06.2003 (Пн) 15:54

Код: Выделить всё
Dim fso As FileSystemObject
Set fso = New FileSystemObject

или
Код: Выделить всё
Set obj = createobject("Scripting.Filesystemobject")

в run-time оба кода дадут одинаковый результат.
Первый код это Early binding (с проверкой properties и вызова функций на стадии компиляции)
Второй код это Late binding (с проверкой properties и вызова функций на стадии run-time)

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 04.06.2003 (Ср) 11:59

Действительно, все одно и то же. Как бы я не конструировал FileSystemObject, программа генерирует ошибку 429.
Есть еще какие-нибудь соображения? Может быть что-то зарегистрировать надо...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 04.06.2003 (Ср) 12:48

scrrun.dll разная в NT и 98
попробуй скачать у мс последнюю версию
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 04.06.2003 (Ср) 13:18

Нет, у меня стоят абсолютно одинаковые версии 5.6.0.6626. :?


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

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

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

    TopList  
cron