【问题标题】:Open windows certificate list from c# dll using Delphi 10 [closed]使用 Delphi 10 从 c# dll 打开 Windows 证书列表 [关闭]
【发布时间】:2016-03-29 01:41:29
【问题描述】:

我整天都在尝试遵循一些关于这个主题的教程和许多答案,但无法弄清楚我做错了什么。 Delphi 甚至不会编译,我需要签署一些 XML 文档,我认为 ref 或 out 字符串参数是最好的方法。提前感谢您的帮助。

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);
            }
        }
    }

它适用于 Windows 窗体:

private void button1_Click(object sender, EventArgs e)
    {
        string TestStr= "123";
        Test.Test.ShowCertificatesList(ref TestStr);


    }

但不是来自德尔福:

 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;

【问题讨论】:

  • 您还没有解释您在使用 Delphi 版本时遇到的问题。 但不是来自 Delphi 并不是一个有意义的问题描述。您对 Delphi 代码有什么具体问题? (除了您使用的不是互操作的 Delphi 字符串,而是将其作为 var 传递。您还说过 DLL 函数将返回 ManagedType.LPWStr,但将函数本身定义为返回 void。从 DLL 代码中并不清楚您要完成什么,而设置 vStrRef := vStrRef; 的 Delphi 代码是无用的。)
  • 抱歉,Delphi 甚至都不会编译。
  • 这也不是一个有意义的问题描述。您遇到了什么具体错误?如果 Delphi 不编译它,它会提供错误消息告诉您原因。它们就在您面前的屏幕上,您可以使用“消息”选项卡中的右键菜单复制/粘贴。您没有在问题中包含该信息的原因为零。您正在寻求免费帮助来解决您的问题;您应该提供您已有的详细信息,让我们尽可能轻松地做到这一点。
  • 它只是一个示例 Ken,为了简化方法,delphi 上的 ManagedType.LPWStr 和 var 来自尝试像这样的一些答案 stackoverflow.com/questions/20521060/…
  • 在delphi上调试没有错误

标签: c# delphi dll x509certificate


【解决方案1】:

Delphi 函数声明不正确。使用WideString 匹配BStr

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

应从 C# 代码中删除以下属性:

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

该函数没有返回值,并且您没有使用 COM。

如果是我,我会使用原生 Windows API。

【讨论】:

  • Hefferman,widestring 解决了你的意思是来自 delphi 的原生 Windows API 的问题?
  • 是的,我就是这个意思。
  • 是的,我知道我会更喜欢这样,我确实尝试过,但是使用 D2009,就像我在上面说的那样,我遇到了很多问题,无法再解决了。我可能会在文件截止日期之后尝试 Lex 解决方案。 Tkx!
  • 好吧,我想我回答了你问的问题,对吧?
  • 是的,先生!我不能投票/标记为有用的一些声誉不够!
【解决方案2】:

只是为了表明一种替代方法。

您始终可以通过本机 API 直接操作 Windows 证书存储(.NET 也使用此类),如博客文章中所述,

http://vanillasky-room.cocolog-nifty.com/blog/2013/10/cryptoapi-and-c.html(日文,但谷歌可以翻译成英文)。

【讨论】:

  • 我们确实有使用 delphi 2009 构建的程序,但在我的研究过程中,我们发现 capcom 已停产,并且我们有许多使用 A3 证书唱歌的例外情况。使用 c# 时没有发生同样的情况,所以我们正在努力寻找出路。
  • 还有大写的“ID”和“id”问题迫使我。
  • @Marisco,将链接更改为更新的链接。 Microsoft 确实发布了新的 API 以使用新标准。您可能必须自己封装新的原生 API,或使用第三方翻译。
  • 非常感谢!我去看看!
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2016-11-20
  • 2021-08-21
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多