函数声明中的别名是否已重载?

时间:2009-02-24 15:29:44

标签: vb.net vb6

我有一些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

我之前没有遇到别名,但我可以猜到它的作用。我不确定的是超载别名背后的原因。如果那就是正在发生的事情。

我需要为TmSendByLen函数创建重载,因为VB.net不支持'As Any',因此我不确定是否应该删除别名或者是否应该将其留在原位。

2 个答案:

答案 0 :(得分:3)

Alias没有指定函数是否完全重载,但指定的名称实际上是在被调用的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不是。 (你可以找到有关它的信息here。)你是否要删除别名完全取决于你,但无论如何,我怀疑你将需要使用As IntPtr(或SafeHandle)而不是As Any

答案 1 :(得分:2)

VB6中的“Alias”关键字可能执行您认为的操作,但是,关键字“别名”之后的引号中的函数名称是DLL中的实际函数名称(即TmSendByLength)。 “声明函数”部分之后的函数名称(即TmSendByLen)实际上是VB6代码将使用的别名。

正如您正确指出的那样,VB6将不允许“As Any”参数类型,因此从您发布的原始VB6代码开发人员已经声明了VB6函数,其顺便提到了与“真实”函数完全相同的名称在DLL中,并将参数更改为此函数以仅接受“msg”参数的字符串类型。

VB6代码实际上并不是重载任何函数,而是包装 DLL函数,其中VB6特定的函数约束“msg”参数类型。

在VB.NET中,由于你不能指定“as any”,我相信你可以用“as object”替换它,虽然这可能不是很有用,因为其他VB.NET调用代码几乎可以传递给任何东西这个参数。你更想要做的是在VB.NET中创建真正的重载函数,其中“msg”参数因你想要接受的类型而不同。这样,您可以允许多种不同的类型,但仍然可以对可以传递给函数的类型保留一些约束。

以下是一些可能有用的链接:

VB6 "As Any" in VB.Net

PInvoke