Perdona... no me di cuenta de tu mensaje hasta hoy que respondía a otro usuario...
El caso, es que falla por varias cuestiones, la primera es que en Delphi, no tienen NPI de lo que es un variant, en segundo lugar, porque la firma de la API es incorrecta...
Te pongo todo el código al caso (incluído el previo)... no te he puesto el tratamiento del png recibido, toda vez que tu señalas que quieres operarlo después con GDI+
El proyecto, asumiendo el código previo anterior aún válido, exige un control image y dos controles de botón. El botón 1 para obtener un fichero bmp que luego cargamos en el control image. El botón 2 para obtener el stream del png (los bytes en memoria, tal cual si hubiéramos pedido un fichero png, y luego leído de disco (obtener el stream es más rápido desde luego, lectura y escritura a y desde disco siempre es más lento que copiar a y desde memoria)).
' Declaraciones
' Nivel de corrección para reconocer posibles fallos. A más calidad, más capacidad de recuperación, pero exige más carga de trabajo, etc...
Private Enum ErrorCorrectionLevel
LowQuality = 0
MediumQuality = 1
StandardQuality = 2
HighQuality = 3
End Enum
' para copiar datos de memoria de un sitio a otro..
Private Declare Sub CMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
' API, para obtener el codigo-QR en un fichero bmp.
Private Declare Sub GuardarImagen Lib "quricol32.dll" Alias "GenerateBMPW" (ByVal file As String, ByVal text As String, ByVal Margen As Long, ByVal PixelSize As Long, ByVal nivel As ErrorCorrectionLevel)
' API, para obtener el stream en formato png.
Private Declare Sub GetPngStream Lib "quricol32.dll" Alias "GetPNGW" (ByVal text As String, ByVal Margen As Integer, ByVal PixelSize As Integer, ByVal nivel As ErrorCorrectionLevel, ByRef bufSize As Long, ByRef ptrBits As Long)
' Código del botón, para obtener una imagen en formato BMP (luego la cargamos).
Private Sub Command1_Click()
Dim ruta As String, ruta2w As String, msg As String
Dim res As Long
msg = StrConv("Hola que tal estas", vbUnicode)
ruta = App.Path & "\Qr.bmp"
ruta2w = StrConv(ruta, vbUnicode)
Call GuardarImagen(ruta2w, msg, 2, 3, HighQuality)
If (Dir(ruta) <> "") Then
Set Image1.Picture = LoadPicture(ruta)
End If
End Sub
' carga del formulario...
Private Sub Form_Load()
Me.BackColor = vbBlack ' contraste para que destaque...
Image1.Stretch = True
End Sub
Private Sub Command2_Click()
Dim msg As String
Dim res As Long, k As Long, ptr As Long
Dim stm() As Byte
msg = StrConv("Hola que tal estas", vbUnicode)
Call GetPngStream(msg, 2, 3, HighQuality, k, ptr)
If (k < 1) Then
MsgBox "No parece haberse recibido ninguna imagen..."
Else
ReDim stm(0 To k - 1)
Call CMem(ByVal VarPtr(stm(0)), ByVal ptr, k)
' tu código restante iría aquí:
' yo sólo imprimo el valor de los bytes... para verificar que es correcto.
For j = 0 To k - 1
Debug.Print stm(j)
Next
' ...
End If
End Sub
Y en efecto, el volcado me arroja:
137
80
78
71
13
10
26
10
0
0
0
13
73
72
68
82
...
que son los bytes correspondientes a la cabecera de un png: "%PNG IHDR"...
..y por último sólo recordarte que al final estamos usando la librería de Delphi Quricol32.dll, no el wrapper de C# Quricol.Barcode.dll.