08.04.2020, 16:58 [+3 UTC]
в нашей команде: 4 353 чел. | участники онлайн: 11 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.85 (07.04.2020)
JS-v.1.38 | CSS-v.3.37

Общие новости:
28.03.2020, 20:29

Форум:
08.04.2020, 15:18

Последний вопрос:
08.04.2020, 16:08
Всего: 151969

Последний ответ:
08.04.2020, 15:24
Всего: 259943

Последняя рассылка:
08.04.2020, 15:16

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
05.07.2012, 12:13 »
Flawless
За юмор отдельное спасибо ;D [вопрос № 186431, ответ № 271322]
23.10.2009, 17:32 »
Mishas
Спасибо! И за первый и за второй вариант. Ответом очень доволен! [вопрос № 173403, ответ № 255750]

РАЗДЕЛ • Basic

Создание программ на языке Basic.

[администратор рассылки: Андреенков Владимир (Академик)]

Лучшие эксперты в этом разделе

solowey
Статус: Специалист
Рейтинг: 522
Megaloman
Статус: Советник
Рейтинг: 229
Sergey V. Gornostaev
Статус: Специалист
Рейтинг: 4

Перейти к консультации №:
 

Консультация онлайн # 145418
Раздел: • Basic
Автор вопроса: Furfurol
Отправлена: 29.09.2008, 14:50
Поступило ответов: 1

VB6
Необходимо выполнять некую функцию только из скомпилированного файла, НЕ из среды разработки. Как это сделать?
Т.е. как определить что это реальный EXE файл, и ток тогда call myfunction...

Подскажите, пожалуйста!

Состояние: Консультация закрыта

Ответ # 230700 от DrakoN

Здравствуйте, Furfurol!
Если я правильно понял вы хотите запсукать функция только если после компиляции собрался полноценнный исполняемый файл. И не хотите в режиме отладки (debug)

Решение использовать директивы компилятора.

Итак суть у вас есть режим дебуга и релиза. Режим релиза подразумевает предварительную компиляцию проекта до получения готового исполняемого файла. И теперь по сути

#if debug then

#end if
Вот здесь более развернутая статья
http://www.e-knizhka.ru/book_vbnet/gl2/gl2_6.php


Консультировал: DrakoN
Дата отправки: 29.09.2008, 16:06

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 145418

PsySex
Профессионал

ID: 848

# 1

= общий = | 29.09.2008, 15:15 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

сейчас нет VB под рукой...поэтому как вариант:-)
Кажется если запускать проект не скомпиленым то переменная App.Path вернет директорию компилятора,т.е. можно проверять в строке наличие подстроки Microsoft Visual .... Еще как вариант прверять размер самого себя FileLen(App.Path+"\"+App.ExeName+".exe")
не помню что возвратит App.ExeName ... возможно имя компилятора при запуске проекта из компилятора.

Furfurol

# 2

= общий = | 29.09.2008, 15:35

...проверять в строке наличие подстроки Microsoft Visual -- возвращает ток если проект не сохранен, иначе savedir проекта
FileLen(App.Path+"\"+App.ExeName+".exe") -- тоже не подходит (разве что как подпорка) msdn говорит
"App.ExeName Returns the root name of the executable file (without the extension) that is currently running. If running in the development environment, returns the name of the project." Т.е. разве что если имя проекта <> имени EXE -- хлипко

PsySex
Профессионал

ID: 848

# 3

= общий = | 29.09.2008, 21:38 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

ответ DrakoN вас устроил?

Furfurol

# 4

= общий = | 30.09.2008, 11:18

С ответом от DrakoN я не очень разобрался
1. В более развернутой статье не совсем VB6, скорее .NET
2. Попробовал я чтото вроде, указав в Conditional Compilation Argumets d=1,
Private Sub Form_Load()
#If d = 1 Then
MsgBox "DEBUG"
#Else
MsgBox "EXE"
#End If
End Sub

но ниче не получилось...

DrakoN

# 5

= общий = | 30.09.2008, 17:17

И это верно что у вас ничего не вышло. Будь вы более внимательны вы бы заметили что директивы компилятора верны как для VB6 так и для VB.Net

Я специально написал вам пример использования

#if debug then

#end if


внутри єтого блока код исполниться только в режиме отладки. Остаьные директивы вы сможете узнать используя МСДН

DrakoN

# 6

= общий = | 30.09.2008, 17:19

Я попытаюсь стянуть 6-ю студию вечером погляжу почему у вас ничего не вышло

Furfurol

# 7

= общий = | 30.09.2008, 18:04

Таки нет, так я сразу пробовал
#if debug then

выдает compile error: Expected: Expression

DrakoN

# 8

= общий = | 01.10.2008, 00:54

Вообщем вам слегка не повезло на мою систему 6-я студия отказалась становиться напрочь. Разбираться почему не горю желанием. Поэтому ответ что да к чему будет утром. Пока я поставлю чистую ХП на VMware пока накачу студию .... ждите, найдем де собака порылась

DrakoN

# 9

= общий = | 01.10.2008, 00:56

я искренне надеюсь что написав
#if debug then
вы не забыли после этого дописать
#end if

PsySex
Профессионал

ID: 848

# 10

= общий = | 01.10.2008, 08:50 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Как я понял внутренней константы debug не существует. В одном из примеров я видел следующую реализацию - в начале формы(модуля) объявляется константа
#Const DebugMode = 1
а затем в коде пишут нужые условия
#If DebugMode = 0 Then
Call MyFunc()
#End If
т.е. нужно вручную подсказывать компилятору как следует запускать прогу.

DrakoN

# 11

= общий = | 01.10.2008, 09:30

Верно замечено это ключевое отличие VB6 от VB.Net

DrakoN

# 12

= общий = | 01.10.2008, 09:39

Так же насколько я помню у кого то из ключевых объектов приложения было что то подобное толи у Aplication то ли у App ( не готов утверждать что верно для VB6 но в .Net точно есть)

Furfurol

# 13

= общий = | 01.10.2008, 10:35

Вроде как чтото нарисовал :)
Такая конструкция выдает при запуске из VB
"C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE"
А из EXE
"C:\windows\system32\MSVBVM60.DLL"

Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Const GWL_HINSTANCE = (-6)
Private Declare Function GetWindowLong_ Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Sub Form_Load()
  Dim iInstance As Long, iDummy As Long
  Dim sExecName As String
  iInstance = GetWindowLong_(Me.hwnd, GWL_HINSTANCE)
  sExecName = String$(255, " ")
  iDummy = GetModuleFileName(iInstance, sExecName, 255)
  MsgBox sExecName
End Sub

PsySex
Профессионал

ID: 848

# 14

= общий = | 01.10.2008, 10:54 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Интересно, а зачем вообще вам это определять?
Если вам для своего удобства при отладке, чтоб не вызывались функции, то тогда правильнее использовать метод предложенный DrakoN'ом, а при вашем методе(впринципе как и в моем варианте с FileLen) это лишний код для скомпиленого ЕХЕ, бесполезный код.

Furfurol

# 15

= общий = | 01.10.2008, 11:03

метод предложенный PsySex -- перед компиляцией в EXE нужно менять значение DebugMode, мона и забыть..
т.е. конструкция "#Const DebugMode = 1" одинаково шо в VB шо в EXE, она указывает компилятору что делать (и для EXE и в DEBUG тоже)

 

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

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14421 сек.

© 2001-2020, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.85 от 07.04.2020
Версия JS: 1.38 | Версия CSS: 3.37