2013-05-20 2 views
1

У меня есть пример кода из MSDN, который я пытаюсь адаптировать для использования, но компилятор VBA отклоняет содержимое угловых скобок < >. У меня есть следующий код в модуле:VBA COM interop troubles

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 или просто искать альтернативный метод вызова функции dll C++, которая, по вашему мнению, ожидает массив строк? – OOhay

+0

@OOhay «Легче» здесь очень субъективно. Вы не используете TLB для связи с этим кодом VB.NET; использование TLB означает, что вы напрямую связываетесь с библиотекой, и вам нужно убедиться, что вы понимаете бизнес-массив/SAFEARRAY на обоих концах. Кроме того, вы не сможете отлаживать, IDE будет сбой, если вы попытаетесь. Кроме того, вы можете создать библиотеку классов видимости COM-VB.NET, которая предоставляет оболочку COM, вызывающую библиотечные функции. В этом случае у вас будет дополнительная DLL-оболочка для переноса и регистрации, но она будет проста в использовании из VBA (один вызов для CreateObject). – GSerg

+0

Спасибо за полный ответ, как вы могли догадаться, я мало знаю о VBA;) – OOhay