2016-03-29 6 views
-2

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; 
+0

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." –

+0

Sorry darüber, Delphi wird nicht sogar kompilieren. – Marisco

+0

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. –

Antwort

0

Die Delphi-Funktion wird falsch deklariert. Verwenden Sie WideStringBStr zum Spiel:

procedure ShowCertificatesList(var pStrRef: WideString); 
    stdcall; external 'Test.dll'; 

Die folgenden Attribute aus dem C# -Code entfernt werden sollte:

[return: MarshalAs(UnmanagedType.LPWStr)] 
[ComVisible(true)] 

Die Funktion hat keinen Rückgabewert und Sie sind nicht mit COM.

Wenn ich es wäre würde ich native Windows-APIs verwenden.

+0

Hefferman, widestring das Problem gelöst, meinen Sie native Windows-APIs aus Delphi? – Marisco

+0

Ja, das ist, was ich meinte. –

+0

Yeah Ii know Ich wollte es lieber und ich habe es versucht, aber mit D2009, wie ich oben sagte, musste ich viele Probleme haben und konnte nicht mehr weiter gehen. Ich versuche, Lex Lösung nach den Dateien Fälligkeitsdatum. Tkx! – Marisco

0

nur einen alternativen Ansatz, um anzuzeigen.

Sie können immer Windows-Zertifikatspeicher manipulieren direkt über native API (.NET verwendet auch so), wie in Blog-Posts enthüllt, wie

http://vanillasky-room.cocolog-nifty.com/blog/2013/10/cryptoapi-and-c.html (in Japanisch, aber Google es auf Englisch übersetzen kann).

+0

Wir haben das Programm mit Delphi 2009 erstellt, aber während meiner Recherchen fanden wir Capcom wurde eingestellt, und wir hatten viele Ausnahmen mit A3-Zertifikat. Dasselbe ist nicht mit C# passiert, also versuchen wir einen Ausweg zu finden. – Marisco

+0

auch die Caps "ID" und "ID" -Problem zwingt mich. – Marisco

+0

@Marisco, änderte den Link zu einem neueren. Microsoft veröffentlicht neue APIs mit neuen Standards arbeiten. Sie müssen möglicherweise die neuen nativen APIs umbrechen Ihre eigenen, oder verwenden Sie die Übersetzung von Dritten –

Verwandte Themen