Две проблемы

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

Две проблемы

Сообщение MIT » 17.09.2006 (Вс) 23:03

Помогите, пожалуйста. У меня есть две проблемы, которые просто необходимо решить.
Первая-как изменить/узнать значение и верхний/нижний предел у ПрогрессБара, если известен его hwnd?
Вторая-глючит GetPrivateProfileString. При попытке ей воспользоваться вылазит ошибка с кнопками отправить и не отправить отчет. Ответ нужен не очень срочно, так как я создат полную работоспособную альтернативу на Бейсике, но нужен для повышения скорости работы моей проги.[/syntax]

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

Сообщение alibek » 17.09.2006 (Вс) 23:12

1. PBM_* (PBM_GETRANGE).
2. Покажи декларацию.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.09.2006 (Пн) 6:29

1. Сообщения в чужой процесс нужно посылать через маршалер, он в кирпичах.
Изображение

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 18.09.2006 (Пн) 21:24

Сначала объявлял как написано в API Viewer'е потом так
Код: Выделить всё
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

но глючит в обоих случаях

tyomitch
Процесс свой :D

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

Сообщение alibek » 18.09.2006 (Пн) 21:33

lpReturnedString укажи по значению (ByVal).
Lasciate ogni speranza, voi ch'entrate.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 18.09.2006 (Пн) 22:10

Не помогло.
Да, кстати, вспомнил. Ещё глючила WritePrivateProfileString с такими же симптомами, но я начал передавать всё как cstr() и глюки исчезли. Может тут тоже чето не то с форматами?

И ещё - как пользоваться RegistryServiceProcess'ом? Пишет, что ненашел точку входа.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 18.09.2006 (Пн) 22:39

alibek писал(а):1. PBM_* (PBM_GETRANGE).

Это в смысле SendMessage?

Вот ещё одна проблема возникла - как из программы отследить события в DLL'ке запущенной самой программой?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.09.2006 (Вт) 7:01

Это в смысле через

Что такое события в DLL'ке? :?:
Последний раз редактировалось Viper 19.09.2006 (Вт) 7:35, всего редактировалось 2 раз(а).
Весь мир матрица, а мы в нем потоки байтов!

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 19.09.2006 (Вт) 7:27

глючит GetPrivateProfileString. При попытке ей воспользоваться вылазит ошибка с кнопками отправить и не отправить отчет

предположу что переменная объявлена не фиксированной длинны?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.09.2006 (Вт) 7:38

Правильное объявление:

Код: Выделить всё
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long


Что и как передаешь в функцию?
Весь мир матрица, а мы в нем потоки байтов!

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 19.09.2006 (Вт) 8:00

MIT
перед вызовом функции, строковую переменную которую передаешь в качестве lpReturnedString надо инициализировать,т .е. например
Код: Выделить всё
lpRet=String$(255, Chr(1))
Если всё делать своими ручками, они скоро отвалятся !

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.09.2006 (Вт) 8:48

MIT писал(а):И ещё - как пользоваться RegistryServiceProcess'ом? Пишет, что ненашел точку входа.
RegisterServiceProcess остался в win98/me.
Лучший способ понять что-то самому — объяснить это другому.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 19.09.2006 (Вт) 22:18

To:!Viper!
The page cannot be found, однако :D

И твоё объявление тоже глючит.

Сначала составил такую функцию:
Код: Выделить всё
Public Function GetProfile2(ByVal FileName As String, Sector As String, StringName As String, StandartValue As String) As String
Dim text As String
    Call GetPrivateProfileString(CStr(Sector), CStr(StringName), CStr(""), text, 1000, CStr(FileName))
    'GetProfileString Sector, StringName, " ", GetProfile, 1000
    GetProfile2 = text
End Function

Мне так удобнее, потом как-то типа так
Код: Выделить всё
GetProfile(App.Path & LangFile, "addgames", "name", "Название")


To:shady
конечно нефиксированной...

To:Kovu
Вот спасибо! Всё проста летает, тока в строке, где должен быть текст стоят знаки Chr(0) :(

To:Antonariy

Да, я где-то читал об этом. Но недавно дизассамбелировал один вирус написанный на VB, и там была декларация этой функции, и вирус действительно был невидем в диспетчере

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 19.09.2006 (Вт) 22:35

To:!Viper!
Забыл сказать - сабытия в DLLке типа кнопку нажали, форму закрыли, в общем ты понял :)
Поюзал метод, стало лучше, но возникают ошибки чтения, часть из них кое как обрабатывается обработчиком и ставится стандартный текст, в остальных случаях пишется фигня или вылазит сообщение типа приложение выполнило недопустимую операцию...

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 19.09.2006 (Вт) 22:47

Там стоят знаки Chr(1) которыми строка была заполнена. Если функция что-то возвращает в эту строку, она часть символов заменяет на нормальные и завершает её Chr(0). Кароче говоря, после отработки функции, обрезаешь строку до нулевого символа.
Если всё делать своими ручками, они скоро отвалятся !

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 20.09.2006 (Ср) 1:58

MIT, перехват событий в длл(пример): http://bbs.vbstreets.ru/viewtopic.php?t ... highlight=
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 20.09.2006 (Ср) 7:23

MIT писал(а):To:!Viper!
И твоё объявление тоже глючит.


Как объявление может глючить? :?: Может все-таки проблема в некорректном вызове функции?

MIT писал(а):Да, я где-то читал об этом. Но недавно дизассамбелировал один вирус написанный на VB, и там была декларация этой функции, и вирус действительно был невидем в диспетчере


От того что эта функция где-то у кого-то объялена, в ОС она не появится. А невидимость в диспетчере вполне может обеспечиваться другими способами.
Последний раз редактировалось Viper 20.09.2006 (Ср) 9:18, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.09.2006 (Ср) 8:45

MIT писал(а):Да, я где-то читал об этом. Но недавно дизассамбелировал один вирус написанный на VB, и там была декларация этой функции, и вирус действительно был невидем в диспетчере
Видимо вирус был научен прятаться во всех версиях винды.
Лучший способ понять что-то самому — объяснить это другому.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 24.09.2006 (Вс) 20:52

!Viper!
Может быть...

Kovu
А если она ничего не возвращает или возвращает ошибку? :)

А у кого стоит w98? Скинте kernel32, pls

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 24.09.2006 (Вс) 21:09

Matew
Пример не плохой, я даже его понял. Но проблема - Васик не узнает ф-ию GetRef. Я её поискал по всем VBA библеотекам - нет!

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 24.09.2006 (Вс) 21:25

MIT
Ну наверное это означает, что та ключ, который ты пытаешься читать, пустой. Ну а если ошибка, посмотри её номер.
Если всё делать своими ручками, они скоро отвалятся !

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 24.09.2006 (Вс) 21:35

13
Несоответствие типов

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 24.09.2006 (Вс) 22:30

MIT
Код: Выделить всё

Option Explicit
Private Declare Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" ( _
     ByVal lpApplicationName As String, _
     ByVal lpKeyName As String, _
     ByVal lpDefault As String, _
     ByVal lpReturnedString As String, _
     ByVal nSize As Long, _
     ByVal lpFileName As String) As Long


Private Function GetProfile2(ByVal FileName As String, Sector As String, StringName As String, StandartValue As String) As String
Dim lpRet As String, cnt As Long
    lpRet = String$(255, 1)
    cnt = GetPrivateProfileString(Sector, StringName, "", lpRet, 255, FileName)
    If cnt >= 1 Then
        lpRet = Left$(lpRet, cnt)
        GetProfile2 = lpRet
    Else
        GetProfile2 = "#ERRORorEMPTY"
    End If
End Function


Private Sub Command1_Click()
Debug.Print GetProfile2("C:\1\config.ini", "General", "BPQ", "")
End Sub

А так? :) Вызов естестно подправь.
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение BV » 24.09.2006 (Вс) 22:34

MIT писал(а):А у кого стоит w98? Скинте kernel32, pls


Можно узнать - зачем?
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;

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 24.09.2006 (Вс) 22:38

Kovu
Круто! Во спасибо! Работает, хотя иногда вместо строки вылазит "#ERRORorEMPTY", но это наверно по моей вине (может строки в файле нет).
P.S.
Замерял - скорость загрузки базы данных возрасла в 17.5 раз!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 24.09.2006 (Вс) 22:41

BV
Для опытов и эксперементов :twisted:

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

Сообщение BV » 24.09.2006 (Вс) 22:48

MIT писал(а):BV
Для опытов и эксперементов :twisted:


Для каких?
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;

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 24.09.2006 (Вс) 22:52

RegisterServiceProcess :D
А ещё там дофига недокументированных функций

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 24.09.2006 (Вс) 23:00

Kovu
Все исправил.

Надо было так
Код: Выделить всё
   
    ....
    If cnt >= 1 Then
        lpRet = Left$(lpRet, cnt)
        GetProfile2 = lpRet
    Else
        GetProfile2 = StandartValue
    End If
    ....


Теперь ваще класс!

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

Сообщение BV » 24.09.2006 (Вс) 23:20

Ну, лови...
Вложения
kernel32_98se.rar
(186.92 Кб) Скачиваний: 15
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;

След.

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

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

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

    TopList