Несколько дней назад я безуспешно пытался использовать (ссылаться) библиотеку 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 ответа
Что ж, после проверок, попыток и неудач я решил изменить свою точку зрения. Так я сделал это
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
После этого я просто загружаю изображение, созданное с помощью источника управления изображением, и получаю доступ к нему. Спасибо Флорану Б. за предоставленный код.
Ваш 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) {
...
}
}
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.