Как получить доступ к именам модулей VB6 из кода? - PullRequest
1 голос
/ 13 апреля 2010

В настоящее время я поддерживаю некоторый код, который, вероятно, скоро будет изменен. Прежде чем это произойдет, я хочу сделать стандартный код обработки ошибок, который внедряется надстройкой, более эффективным и занимать меньше места. Меня раздражает то, что у каждого модуля есть константа с именем m_ksModuleName, которая используется для создания большой строки, которая затем перебрасывается из обработчика ошибок, чтобы мы могли отслеживать стек ошибок. Это весь код шаблона, то есть повторяющийся, но я мог бы легко сократить его до вызова процедуры. Теперь я исправил код, чтобы вы могли передать ссылку Me на процедуру - но вы не можете сделать это для модулей BAS. Также вы не можете получить доступ к имени проекта (например, к той части, которая будет передана как часть идентификатора программы) - хотя вы получаете его при возникновении ошибки самостоятельно.

Все эти строки содержатся в EXE, DLL или OCX - поверьте мне, я использовал отладчик для их поиска. Но как я могу получить к ним доступ в коде?

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

AFAIK, нет способа получить имя модуля BAS в коде. Обычное решение - использовать константу уровня модуля, как в ответе Майка .

AFAIK единственный способ получить ProgID (программный идентификатор, Имя проекта в диалоговом окне свойств проекта) - это вызвать ошибку в модуле BAS, перехватить ее и прочитать Err.Source .

Это все довольно хлопотно, и поэтому мы обычно не пытаемся включать имя модуля или ProgID в наши стандартные обработчики ошибок. Мы «катим свой» стек вызовов с именами подпрограмм. Этого всегда достаточно, чтобы узнать, какие модули задействованы. Подпрограммы в модулях BAS обычно имеют уникальные имена, верно?

Что-то вроде this , и вы можете добавить это автоматически с помощью бесплатной надстройки MZTools VB6.

Sub / Function whatever 
On Error Goto Handler
do some stuff
Exit Sub / Function

Handler:
Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description 
End Sub

Каждая подпрограмма верхнего уровня в DLL или OCX имеет аналогичный обработчик ошибок, но также включает App.ExeName, поэтому мы можем определить, когда ошибки пересекают границы компонента.

1 голос
/ 14 апреля 2010

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

'In MyModule.bas'

Public Sub Foo()

   Const MODULE_NAME As String = "MyModule"

   On Error GoTo ErrorHandler

   ' Code here '

   Exit Sub

ErrorHandler:

   LogError Err.Number, Err.Description, MODULE_NAME

End Sub   

Если вы используете надстройку, такую ​​как MZTools, она генерирует этот шаблонный код для вас.

Что касается получения текущего имени компонента, вы можете получить к нему доступ, используя App.EXEName (несмотря на имя, это работает для других типов проектов, таких как DLL). Это значение извлекается из поля Project Name в свойствах проекта (Project -> Properties) при работе в IDE и из имени скомпилированного двоичного файла (за исключением расширения файла) при запуске вне IDE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...