Консультация № 145418
29.09.2008, 14:50
0.00 руб.
0 16 1
VB6
Необходимо выполнять некую функцию только из скомпилированного файла, НЕ из среды разработки. Как это сделать?
Т.е. как определить что это реальный EXE файл, и ток тогда call myfunction...

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

Обсуждение

давно
Профессионал
848
1596
29.09.2008, 15:15
общий
сейчас нет VB под рукой...поэтому как вариант:-)
Кажется если запускать проект не скомпиленым то переменная App.Path вернет директорию компилятора,т.е. можно проверять в строке наличие подстроки Microsoft Visual .... Еще как вариант прверять размер самого себя FileLen(App.Path+""+App.ExeName+".exe")
не помню что возвратит App.ExeName ... возможно имя компилятора при запуске проекта из компилятора.
Неизвестный
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 -- хлипко
Неизвестный
29.09.2008, 16:06
общий
это ответ
Здравствуйте, Furfurol!
Если я правильно понял вы хотите запсукать функция только если после компиляции собрался полноценнный исполняемый файл. И не хотите в режиме отладки (debug)

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

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

#if debug then

#end if
Вот здесь более развернутая статья
http://www.e-knizhka.ru/book_vbnet/gl2/gl2_6.php
давно
Профессионал
848
1596
29.09.2008, 21:38
общий
ответ DrakoN вас устроил?
Неизвестный
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

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

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

Код:
 #if debug then

#end if


внутри єтого блока код исполниться только в режиме отладки. Остаьные директивы вы сможете узнать используя МСДН
Неизвестный
30.09.2008, 17:19
общий
Я попытаюсь стянуть 6-ю студию вечером погляжу почему у вас ничего не вышло
Неизвестный
30.09.2008, 18:04
общий
Таки нет, так я сразу пробовал
#if debug then

выдает compile error: Expected: Expression
Неизвестный
01.10.2008, 00:54
общий
Вообщем вам слегка не повезло на мою систему 6-я студия отказалась становиться напрочь. Разбираться почему не горю желанием. Поэтому ответ что да к чему будет утром. Пока я поставлю чистую ХП на VMware пока накачу студию .... ждите, найдем де собака порылась
Неизвестный
01.10.2008, 00:56
общий
я искренне надеюсь что написав
#if debug then
вы не забыли после этого дописать
#end if
давно
Профессионал
848
1596
01.10.2008, 08:50
общий
Как я понял внутренней константы debug не существует. В одном из примеров я видел следующую реализацию - в начале формы(модуля) объявляется константа
#Const DebugMode = 1
а затем в коде пишут нужые условия
#If DebugMode = 0 Then
Call MyFunc()
#End If
т.е. нужно вручную подсказывать компилятору как следует запускать прогу.
Неизвестный
01.10.2008, 09:30
общий
Верно замечено это ключевое отличие VB6 от VB.Net
Неизвестный
01.10.2008, 09:39
общий
Так же насколько я помню у кого то из ключевых объектов приложения было что то подобное толи у Aplication то ли у App ( не готов утверждать что верно для VB6 но в .Net точно есть)
Неизвестный
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

давно
Профессионал
848
1596
01.10.2008, 10:54
общий
Интересно, а зачем вообще вам это определять?
Если вам для своего удобства при отладке, чтоб не вызывались функции, то тогда правильнее использовать метод предложенный DrakoN'ом, а при вашем методе(впринципе как и в моем варианте с FileLen) это лишний код для скомпиленого ЕХЕ, бесполезный код.
Неизвестный
01.10.2008, 11:03
общий
метод предложенный PsySex -- перед компиляцией в EXE нужно менять значение DebugMode, мона и забыть..
т.е. конструкция "#Const DebugMode = 1" одинаково шо в VB шо в EXE, она указывает компилятору что делать (и для EXE и в DEBUG тоже)
Форма ответа