[VB] Как проверить, что код работает в IDE?

Хакер дает советы, раскрывает секреты и делится своими мыслями по поводу программирования.

Модератор: Хакер

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

[VB] Как проверить, что код работает в IDE?

Сообщение Хакер » 07.12.2010 (Вт) 18:52

Существуют случаи, когда один и тот же проект, в зависимости от того, под IDE или в виде скомпилированного файла он выполняется, должен использовать разные кусочки кода.

В VB есть условная компиляция (#if...#endif), но нет встроенной константы, определяющей, в каком режиме запущен проект.

Я видел много вариантов определения того, под IDE или нет работает проект, но все они обладали одним общим недостатком: проверка выполнялась в run-time.

Вот самый распространённый вариант:
Код: Выделить всё
Public Function IsInIDE() As Boolean
    On Error GoTo InIDE
    Debug.Print 1 / 0
    IsInIDE= False
    Exit Function
InIDE:
    IsInIDE= True
End Function


При этом, в готовом скомпилированном файле остаются проверки и действия, которые заведомо будут всегда работать одним и тем же образом.

Вот например:
Код: Выделить всё
If IsInIDE Then
   MakeSomethingBad
   MakeSomethingVeryBad
   MakeSomethingVeryVeryBad
Else
   MakeSomethingGood
End if


В скомпилированный файл попадёт функция IsInIde, мало того, что она всегда будет выполняться (и всегда отрицательно), в скомпилированный файл также попадут сами функции MakeSomethingBad, MakeSomethingVeryBad и MakeSomethingVeryVeryBad, да плюс вызовы этих функций.

По сравнению с уловной компиляцией такой расклад — очень плохо.

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

Вы заводите в каком-нибудь модуле функцию со следующим кодом:
Код: Выделить всё
Public Function MakeTrue(ByRef bvar As Boolean) As Boolean
    bvar = True
    MakeTrue = True
End Function


А затем, когда вам понадобится разместить код, который должен по разному работать, делаете следующее:
Код: Выделить всё
    Dim WE_ARE_IN_IDE As Boolean
    Debug.Assert MakeTrue(WE_ARE_IN_IDE)
   
    If WE_ARE_IN_IDE Then
        MsgBox "Мы в IDE"
        MakeSomethingBad
    Else
        MsgBox "Мы в скомпилированном файле"
        MakeSomethingGood
    End If


Когда вы работаете в IDE, функция MakeTrue установит истинное значение переменной bInIde. Вы будите проверять последнюю, и, с учётом её истинности, будет выполняться первый кусочек кода.

Когда же вы скомпилируете программу:
  • выражение из Debug.Assert уничтожится (читайте справку по Debug)
  • не останется ни одного вызова функции MakeTrue
  • функция MakeTrue скомпилирована на будет и в exe-файл не попадёт
  • умный компилятор увидит, что переменная WE_ARE_IN_IDE нигде не устанавливается и «заменит её на константу False»
  • Будет обработана и скомпилирована только Else-ветка If-а, потому что условие в If-е константно и ложно.
  • Вызов MakeSomethingBad скомпилирован не будет и в exe-файл не попадёт. Если нигде в других оставшихся местах эта функция не вызывается, то и сама MakeSomethingBad скомпилирована не будет, и её код в exe-файл не попадёт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [VB] Как проверить, что код работает в IDE?

Сообщение arthur2 » 07.12.2010 (Вт) 21:55

Офигеть!
Артур
 
   

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

Re: [VB] Как проверить, что код работает в IDE?

Сообщение Viper » 08.12.2010 (Ср) 9:34

arthur2 писал(а):Офигеть!
Эт точно! А главное просто до невозможности.
Весь мир матрица, а мы в нем потоки байтов!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [VB] Как проверить, что код работает в IDE?

Сообщение arthur2 » 08.12.2010 (Ср) 19:58

Ведь если объявить в модуле как публичную: Public WE_ARE_IN_IDE As Boolean всё останется так же?
Ещё раз - офигеть :D !!!
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: [VB] Как проверить, что код работает в IDE?

Сообщение Хакер » 08.12.2010 (Ср) 20:38

arthur2 писал(а):Ведь если объявить в модуле как публичную

Нет, устранять глобальную переменную компилятор не рискнёт. Нет никакой гарантии, что её никто не изменит. А вот то, что локальную переменную в пределах функции никто не изменит, гарантия есть.

Нет никакой проблемы объвлять WE_ARE_IN_IDE в каждой своей процедуре. Во-первых, на в каждом процедуре приходится делать дифференциацию на In-IDE и Stand-Alone код. А во-вторых, никаких издержек от того, что в нескольких процедурах будет такая переменная, не будет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [VB] Как проверить, что код работает в IDE?

Сообщение arthur2 » 08.12.2010 (Ср) 20:54

Жаль, ну да и ладно :) Как есть - просто чуть менее удобно, но всё равно здорово!
Артур
 
   

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: [VB] Как проверить, что код работает в IDE?

Сообщение uni » 03.01.2011 (Пн) 1:54

Здорово работает! Как раз понадобилось, т.к. приходилось вручную вводить специальную глобальную переменную и изменять её для этих целей. Работа с хуками вышибает у меня постоянно IDE, заколебало уже. Теперь всё автоматизировано. Жаль только, что я не программирую в VB.
Россия навсегда!
Сетрификаты

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [VB] Как проверить, что код работает в IDE?

Сообщение arthur2 » 10.01.2011 (Пн) 20:09

Хакер писал(а):# Будет обработана и скомпилирована только Else-ветка If-а, потому что условие в If-е константно и ложно.
# Вызов MakeSomethingBad скомпилирован не будет и в exe-файл не попадёт. Если нигде в других оставшихся местах эта функция не вызывается, то и сама MakeSomethingBad скомпилирована не будет, и её код в exe-файл не попадёт.

Вопрос вдогонку: а если я объявлю глобальную константу DebugMod as Boolien=false, то все ветки, в которых её значение проверяется на истинность - тоже скомпилированы не будут?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: [VB] Как проверить, что код работает в IDE?

Сообщение Хакер » 10.01.2011 (Пн) 20:12

arthur2 писал(а):Вопрос вдогонку: а если я объявлю глобальную константу DebugMod as Boolien=false, то все ветки, в которых её значение проверяется на истинность - тоже скомпилированы не будут

Но так они и выполнены не будет вообще, в чём тогда смысл?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [VB] Как проверить, что код работает в IDE?

Сообщение arthur2 » 10.01.2011 (Пн) 20:55

Да в том же приблизительно. Просто конструкции с #if не очень удобны и плохочитаемы, а константы условной компиляции нужно прописывать или в каждом модуле, или в настройках проекта, что тоже не удобно.

А одна строка вроде if DebugMod then DoSomeTingBad()на мой взгляд, гораздо удобнее и читабельнее.
Остается в единственном модуле написать:
Код: Выделить всё
#if RELEASE then
public const DebugMod as boolean = false
#else
public const DebugMod as boolean = true
#end if


Твой способ изящен и к тому же не требует ничего менять в проекте для компиляции релиза. Но он всё же довольно громоздкий. Я давно написал себе маленькую программку (даже не аддин) которая просто делает копию файла текущего проекта, вписывает в неё глобальную константу условной компиляции RELEASE = 1 и запускает make.
Артур
 
   

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

Re: [VB] Как проверить, что код работает в IDE?

Сообщение alibek » 10.01.2011 (Пн) 22:22

arthur2 писал(а):Я давно написал себе маленькую программку (даже не аддин) которая просто делает копию файла текущего проекта, вписывает в неё глобальную константу условной компиляции RELEASE = 1 и запускает make.

Выполни vb6.exe /?
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [VB] Как проверить, что код работает в IDE?

Сообщение arthur2 » 10.01.2011 (Пн) 22:48

ага :) :oops:
Ты же мне и советовал. Я просто подзабыл - на самом деле, моя программка не меняет копию, а запускает её с параметрами /d RELEASE=1 /make

Ну да, а копия нужна - чтобы позволили компилировать уже запущенный проект.
Артур
 
   


Вернуться в МануAll

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList