Ich habe den ganzen Tag versucht, einige Tutorials und viele Antworten zu diesem Thema, aber kann nicht herausfinden, was ich falsch mache. Delphi wird nicht einmal kompilieren, ich werde einige XML-Dokumente signieren müssen und ich dachte, ein Ref- oder Out-String-Parameter wäre der beste Weg, dies zu tun. Vielen Dank im Voraus für jede Hilfe.Öffnen Sie Windows-Zertifikatsliste von C# dll mit Delphi 10
DLL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Xml;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace Test
{
public class Test
{
[DllExport(CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPWStr)]
[ComVisible(true)]
public static void ShowCertificatesList([MarshalAs(UnmanagedType.BStr)] ref string pXmlDoc)
{
pXmlDoc = "test";
var store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates;
X509CertificateCollection vListaCertificados;
vListaCertificados = X509Certificate2UI.SelectFromCollection(certificates, "test", "Certificate list", X509SelectionFlag.SingleSelection);
}
}
}
es funktioniert unter Windows Form:
private void button1_Click(object sender, EventArgs e)
{
string TestStr= "123";
Test.Test.ShowCertificatesList(ref TestStr);
}
Aber nicht von Delphi:
var
Form3: TForm3;
procedure ShowCertificatesList(var pStrRef : String) ; stdcall; external 'Test.dll' name 'ShowCertificatesList';
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var
vStrRef: String;
begin
vStrRef:= 'in' ;
ShowCertificatesList(vStrRef);
vStrRef := vStrRef;
end;
Sie haben nicht erklärt, was das Problem mit der Delphi-Version ist. * Aber nicht aus Delphi * ist keine sinnvolle Problembeschreibung. Was für ein spezifisches Problem haben Sie mit dem Delphi-Code? (Abgesehen davon, dass Sie eine Delphi-Zeichenfolge verwenden, die kein Interop ist, und Sie übergeben sie als Var. Sie haben auch gesagt, dass die DLL-Funktion "ManagedType.LPWStr" zurückgibt, aber die Funktion definiert "Es ist nicht klar, aus dem DLL-Code genau das, was Sie erreichen möchten, und der Delphi-Code, der' vStrRef: = vStrRef; 'setzt, ist ein Noop." –
Sorry darüber, Delphi wird nicht sogar kompilieren. – Marisco
Das ist auch keine sinnvolle Problembeschreibung. Welchen ** spezifischen Fehler ** bekommen Sie? Wenn Delphi es nicht kompiliert, gibt es Fehlermeldungen, die Ihnen sagen, warum. Sie sind direkt auf Ihrem Bildschirm vor Ihnen, und Sie können kopieren/einfügen mit dem Rechtsklick-Menü von der Registerkarte Nachrichten. Es gibt keinen Grund dafür, dass Sie diese Informationen nicht in Ihre Frage aufnehmen. Sie bitten um ** kostenlose Hilfe **, um ** Ihr Problem zu lösen **; Sie sollten es so einfach wie möglich machen, indem Sie uns die Details zur Verfügung stellen, die Ihnen bereits zur Verfügung stehen. –