2013-05-20 136 views
1

我有一些来自MSDN的示例代码,我试图适应其使用,但VBA编译器拒绝了角度括号< >的内容。我有一个模块在下面的代码:VBA COM互操作问题

Imports System 

Imports System.Runtime.InteropServices 


<DllImport("../../insert_dll_name_here.dll", CallingConvention:=CallingConvention.Cdecl)> _ 
Public Function Test(file() As String) As Integer 
End Function 

我想利用这个代码来调用从C一个简单的函数++动态链接库将字符串数组,但我得到的编译错误“预计行号或标号或声明或声明的结尾“,并且没有找到可用于任何用途的帮助菜单。我已经试过方括号[ ]以防万一这是VBA版本的问题无济于事。有人能指出我在使用COM互操作服务时的错误。

回答

1

代码是VB.NET。这不是VBA。

在VBA中,你会写,

Declare Function Test Lib "../../insert_dll_name_here.dll" (file() As String) As Long 

然而,VBA不直接支持cdecl惯例,但你可以make it work with a type library。您可能还会遇到file() As String阵列的问题 - 请确保在C++端正确处理它。

作为一个方面说明,这与COM没有任何关系。这是从外部库调用一个函数。

+0

是的,你说得对,显然我在星期一早上阅读MSDN主题的能力值得怀疑。那么,使用类型库链接到这段VB.net还是更容易一些,或者只是寻找另一种调用C++ dll函数的方法,这种方法需要在您看来有一系列字符串? – OOhay

+0

@OOhay“更容易”是非常主观的。你不使用TLB链接到这个VB.NET代码;使用TLB意味着您直接链接到库,并且您必须确保您了解两端的字符串数组/ SAFEARRAY业务。此外,您将无法进行调试,如果尝试,IDE将崩溃。或者,您可以创建一个VB.NET COM可见类库,公开一个调用库函数的COM包装器。在这种情况下,您将拥有附加的包装器DLL来进行注册,但从VBA(对CreateObject的单个调用)使用起来会很容易。 – GSerg

+0

感谢您的完整答案,您可能已经猜到了,我对VBA知之甚少;) – OOhay