函数声明中的别名重载?

问题描述:

我有我转换成VB.net一些VB6代码和跨越这部分函数声明中的别名重载?

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”,所以我不确定是否应该删除别名或者是否应该将其保留。

+0

感谢编辑乔尔。实际上应该读它,而不是在我发布之前进行思考:) – Tanj 2009-02-24 15:40:36

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

在VB6的“别名”关键字是可能做什么,你想这样做,但是,它在引号中的函数名关键字“别名”,也就是在DLL中的实际功能名称(即TmSendByLength后)。 “声明函数”部分(即TmSendByLen)之后的函数名称实际上是VB6代码将使用的别名。如您正确指出的那样,VB6将不允许“As Any”参数类型,因此从您发布的原始VB6代码开发者已经声明了一个VB6函数,该函数偶尔具有与“真实”相同的名称,函数,并将参数更改为此函数,以仅接受“msg”参数的字符串类型。

VB6的代码,是不是真正超载任何功能,而是它的包装与约束的“味精”参数类型VB6的一个特定的DLL功能。因为其他VB.NET调用代码几乎可以传递任何东西,所以在VB.NET中,因为你不能指定“as any”,所以我相信你可以用“as object”替换它,尽管这可能不是很有帮助。到这个参数。你更可能想要做的是在VB.NET中创建real重载函数,其中“msg”参数因您想要接受的类型而异。这样,您可以允许多种不同类型,但仍然保留一些约束,以便将哪些类型传递给该函数。

这里有几个链接,很可能帮助:

VB6 "As Any" in VB.Net

PInvoke