Псевдоним в объявлении функций перегружен? - PullRequest
0 голосов
/ 24 февраля 2009

У меня есть код VB6, который я конвертирую в VB.net, и наткнулся на этот раздел

Declare Function TmSendByLen Lib "tmctl.dll"  Alias "TmSendByLength"(ByVal id As Integer, ByRef msg As Any, ByVal blen As Integer) As Integer
'snip'

Function TmSendByLength(ByVal id As Integer, ByVal msg As String, ByVal blen As Integer) As Integer
    TmSendByLength = TmSendByLen(id, msg, blen)
End Function

Я раньше не сталкивался с термином Alias, но могу догадаться, что он делает. В чем я не уверен, так это в причине перегрузки псевдонима. Если это то, что происходит.

Мне нужно создать перегрузки для функции TmSendByLen, так как «Как угодно» не поддерживается в VB.net, поэтому я не уверен, должен ли я просто удалить псевдоним или оставить его на месте.

Ответы [ 2 ]

3 голосов
/ 24 февраля 2009

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

Поскольку ваш пример немного сбивает с толку (из-за повторяющихся имен), я буду использовать слегка измененную версию для объяснения:

Declare Function TmSendByLen Lib "tmctl.dll" Alias "TmSendByLength" (ByVal id As Integer, ByRef msg As Any, ByVal blen As Integer) As Integer)

Function InternalVersion(ByVal id As Integer, ByVal msg As String, ByVal blen As Integer) As Integer
    InternalVersion = TmSendByLen(id, msg, blen)
End Function

Таким образом, в этой измененной версии имя TmSendByLength - это то, что точка входа указанной функции действительно вызывается в tmctl.dll. TmSendByLen - это то, что мы называем в нашем коде, а InternalVersion - имя функции-оболочки.

Я бы предположил, что это так, что InternalVersion может вызываться через модули / классы, тогда как версия TmSendByLen должна была быть закрытой.

Чтобы ответить на вторую часть вашего вопроса, Alias ​​по-прежнему доступен в VB.NET, а As Any - нет. (Вы можете найти информацию об этом здесь .) Хотите ли вы удалить псевдоним или нет, полностью зависит от вас, но в любом случае, я подозреваю, что вам нужно будет использовать As IntPtr (или SafeHandle) вместо As Any.

2 голосов
/ 24 февраля 2009

Ключевое слово "Alias" в VB6: , вероятно, делает то, что, как вы думаете, делает, однако это имя функции в кавычках после ключевое слово "псевдоним", которое является реальной функцией имя в DLL (т. е. TmSendByLength). Имя функции после части «Объявление функции» (т. Е. TmSendByLen) фактически является псевдонимом, который будет использовать код VB6.

Как вы правильно заметили, VB6 не будет разрешать тип параметра «Как любой», поэтому из исходного кода VB6, который вы разместили, разработчик объявил функцию VB6, которая случайно имеет то же имя, что и «настоящая» функция в DLL, и изменил параметры этой функции, чтобы принимать только строковый тип для параметра "msg".

Код VB6 "как есть" на самом деле не перегрузка какой-либо функции, а скорее обтекание функции DLL специфичной для VB6, которая ограничивает тип параметра "msg".

В VB.NET, поскольку вы не можете указать «как любой», я полагаю, что вы можете заменить это на «как объект», хотя это может быть не очень полезно, поскольку другой вызывающий код VB.NET может передавать практически все, что угодно этот параметр. Скорее всего, вам захочется создать перегруженные функции real в VB.NET, где параметр "msg" отличается типом, который вы хотите принять. Таким образом, вы можете разрешить несколько разных типов, но при этом сохранить некоторые ограничения на то, какие типы могут быть переданы в функцию.

Вот пара ссылок, которые вполне могут помочь:

VB6 "Как любой" в VB.Net

PInvoke

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