【发布时间】: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