Несколько дней назад я безуспешно пытался использовать (ссылаться) библиотеку QRCode .net без интерфейса в ms access vba. Итак, я провел небольшое исследование, и люди здесь руководили мной. Поэтому я решил сделать интерфейс, по которому я выполнил следующие шаги https: // whoisburiedhere .wordpress.com / 2011/07/12 / create-a-com-object-from-scratch-with-c /

Мне удалось увидеть intellisense и создать некоторые объекты и переменные других классов, но у меня проблемы с классом, в котором я вижу Dispose (), но не могу использовать New в доступе ms:

[Dim QRCD as New QRCode]

Я получаю сообщение об ошибке, что использование New недопустимо, но я могу объявить это строкой:

Dim QRCD as QRCode

[Я думаю, что это не объект {Если я попытаюсь сделать его равным QRData «Это не разрешено», сработает ошибка}] этот класс реализует абстрактный класс, который имеет ограничения, которые я пытался поместить в этот интерфейс в абстрактный класс и Я получаю сообщение об ошибке «Не реализует метод», если помещаю его в дочерний класс. Я не могу создать объект и не вижу ни одного из методов с поздним связыванием. Библиотеку QRCoder можно найти здесь. https://github.com/codebude/QRCoder Это абстрактный класс в том виде, в котором он предоставляется.

{
using System;

public abstract class AbstractQRCode<T>
{
    protected QRCodeData qrCodeData;

    protected AbstractQRCode(QRCodeData data)
    {
        qrCodeData = data;
    }
    public abstract T GetGraphic(int pixelsPerModule);
}

}

Это дочерний класс, который его реализует; он уже изменен с интерфейсом. Это не весь код, но несколько методов, все называемые GetGraphic (что-то как-то), которые отличаются друг от друга.

    [ComVisible(true)]
[Guid("It's filled in the program"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface neker
{

    Bitmap GetGraphic(int pixelsPerModule);
}
[ComVisible(true)]
[Guid(""), ClassInterface(ClassInterfaceType.AutoDual)]

public class QRCode :AbstractQRCode<Bitmap>, IDisposable, neker
{
    public QRCode(QRCodeData data) : base(data) {}

    public override Bitmap GetGraphic(int pixelsPerModule)
    {
        return GetGraphic(pixelsPerModule, Color.Black, Color.White, true);
    }

    public Bitmap GetGraphic(int pixelsPerModule, string darkColorHtmlHex, string lightColorHtmlHex, bool drawQuietZones = true)
    {
        return GetGraphic(pixelsPerModule, ColorTranslator.FromHtml(darkColorHtmlHex), ColorTranslator.FromHtml(lightColorHtmlHex), true);
    }

Это образец кода (также предоставляется)

QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode("The text which should be encoded.", QRCodeGenerator.ECCLevel.Q);
QRCode qrCode = new QRCode(qrCodeData);
Bitmap qrCodeImage = qrCode.GetGraphic(20);

Это мой код на VBA [Это в модуле]

Public Sub QRCreator(QRtext As String)
Dim QRCG As QRCoder.QRCodeGenerator
Set QRCG = New QRCoder.QRCodeGenerator
Dim QRCD As QRCodeData
Set QRCD = QRCG.CreateQRCode(QRtext, ECCLevel_Q, False)
Dim QRCO As QRCode
Set QRCO = Factory.CreateQRCode(QRCD)
Forms!Formulario1.[Oleobject].Picture = QRCO.GetGraphic(5)
End Sub

Public Sub InitiateProperties(Data As QRCodeData)
//I declared it as Variant since QRCode is not avaliable
Dim m_data As Variant
m_data = Data
End Sub

Это в другом модуле [я использую эти модули для создания объекта с параметрами] Передайте аргументы в Конструктор в VBA

Public Function CreateQRCode(Data As QRCodeData) As QRCode
//you see the word new is missing If I run it it says "An object is required"

Set CreateQRCode = QRCode
CreateQRCode.InitiateProperties Data:=Data

End Function

Как я могу изменить его, чтобы его можно было использовать с Microsoft Access 2013? Есть ли другой способ сделать это без интерфейсов? Поддерживает ли доступ растровые изображения в vba? Я новичок во всем этом, так что большое вам спасибо.

РЕДАКТИРОВАТЬ: ПРИЧИНА, ПО КОТОРУЮ Я НЕ МОГ СДЕЛАТЬ ЭТО РАБОТАТЬ, БЫЛА ВИДИМОЙ, НЕ ПОДДЕРЖИВАЕТ КОНСТРУКТОРОВ ПАРАМЕТРАМИ И МЕТОДЫ С ПЕРЕПОЛНЕНИЕМ. ОТВЕТ, ТОГДА Я МОГУ ЛЮБИМ СОЗДАТЬ ИЗОБРАЖЕНИЯ.

2
José González 27 Апр 2016 в 08:08

2 ответа

Лучший ответ

Что ж, после проверок, попыток и неудач я решил изменить свою точку зрения. Так я сделал это

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Interop;
using System.Runtime.InteropServices;
using stdole;
namespace QRCoder
{
[Guid("52724C82-F18C-460B-B48D-1F19E016F86E")]
[ComVisible (true) , InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IQRCodeGene
{
    string Create(string text, QRCodeGenerator.ECCLevel value, int pixelsPerModule);
}
[Guid("4F445AA5-D642-438B-A69A-429D621A3CB0")]
[ComVisible (true), ClassInterface(ClassInterfaceType.None)]
   public class QRCodeGene: IQRCodeGene, IDisposable
{
    private QRCodeGenerator Instance;
    public QRCodeGene()
    {
        Instance = new QRCodeGenerator();
    }
    public string Create(string text, QRCodeGenerator.ECCLevel value, int pixelsPerModule)
    {
        var qrCodeData = Instance.CreateQrCode(text, value);
        var qrCode = new QRCode(qrCodeData);
        var bitmap = qrCode.GetGraphic(pixelsPerModule);
// This line is the only modified by the provided in the code above.
        bitmap.Save("C:\\"+text+".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
//I return this string for testing. I guess If removed the text wouldn't work.
        return ("Hello");
    }
    public void Dispose()
    {
        Instance.Dispose();
    }

}
}

Приведенный выше код генерирует QR-код всего, что я отправил бы через эту функцию в доступе VBA:

Public Sub QR(Text As String)
Dim QRC As New QRCodeGene
Dim x As String
x = QRC.Create(Text, ECCLevel_Q, 5)

End Sub

После этого я просто загружаю изображение, созданное с помощью источника управления изображением, и получаю доступ к нему. Спасибо Флорану Б. за предоставленный код.

1
José González 12 Май 2016 в 23:00

Ваш COM-объект не может быть создан, потому что у класса нет конструктора по умолчанию. Вместо того, чтобы пытаться раскрыть исходный API, вы должны создать один класс с методами, соответствующими вашим потребностям:

Использование VBA:

Public Sub QRCreator(text As String)
  Dim qrc As New QRCoder.QRCodeGenerator
  Forms!Formulario1.[Oleobject].Picture = qrc.Create(text, CCLevel_Q, 5)
End Sub

.Сеть :

[Guid("C7CC4CA0-813A-431E-B92C-842A07735E72")]
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface _QRCodeGenerator {

    public IStdPicture Create(string text, int cclevel, int pixelsPerModule);

}


[ProgId("QRCoder.QRCodeGenerator")]
[Guid("4DC2C1F8-2727-4120-80E1-8475650D8547")]
[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
[Description("...")]
public class QRCodeGenerator : _QRCodeGenerator, IDisposable {

    private QRCoder.QRCodeGenerator instance;

    public QRCodeGenerator() {
        instance = new QRCoder.QRCodeGenerator();
    }

    public IStdPicture Create(string text, int cclevel, int pixelsPerModule){
        var qrCodeData = instance.CreateQrCode(text, cclevel);
        var qrCode = new QRCoder.QRCode(qrCodeData);
        var bitmap = qrCode.GetGraphic(pixelsPerModule);
        return ImageToPicture(bitmap);
    }

    public void Dispose() {
        instance.Dispose();
    }

    private static IStdPicture ImageToPicture(Bitmap bitmap) {
        ...
    }
}
1
Florent B. 27 Апр 2016 в 06:47