2013-05-13 73 views
1

一位朋友,.NET(C#)DLL问我写在C#中的DLL文件Delphi应用程序。他想使用这个函数decleration与它沟通:写作Delphi应用程序

function OpenAddOnFile(const mafCode: PWideChar; const mafFilePath: PWideChar; 
        const mafVersion: PWideChar): Pointer; stdcall; 

我遇到的问题是它翻译成C#。可等PWideChar心不是...我已经尝试过这样的:

public Pointer OpenAddOnFile(
    [MarshalAs(UnmanagedType.LPWStr)]string mafcode,  
    [MarshalAs(UnmanagedType.LPWStr)]string maffilepath, 
    [MarshalAs(UnmanagedType.LPWStr)]string mafversion 
) 

但它不工作现在:)

进一步我怎么能在C#中返回一个指针,以我的形式?

有人可以帮我吗? 在此先感谢!

编辑:\

他给了我这个额外的代码: 我问他对于函数调用,他给了我一个信息:

unit unAddOn; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    Vcl.ComCtrls; 

function LoadAddOnFile(aPath: String; aVersion: String; var aFilePath: String; 
         var aCode: String): Boolean; 

const 
    AddOnExt: String = '.maf'; 

implementation 

function LoadAddOnFile(aPath: String; aVersion: String; var aFilePath: String; 
        var aCode: String): Boolean; 
type 
    TOpenAddOnFile = function(const mafCode: PWideChar; const mafFilePath: PWideChar; 
         const mafVersion: PWideChar): Pointer; stdcall; 
    TCloseAddOnFile = procedure(var mafCode: PWideChar; var mafFilePath: PWideChar; 
          var mafQuitPopUp: PWideChar); stdcall; 
var 
    CloseAddOnFile: TCloseAddOnFile; 
    OpenAddOnFile: TOpenAddOnFile; 
    AddOnMainForm: TForm; 
    AddOnHandle: THandle; 
    mafQuitPopUp: PWideChar; 
    mafFilePath: PWideChar; 
    mafVersion: PWideChar; 
    mafCode: PWideChar; 
begin 
    Result := True; 
    mafQuitPopUp := PWideChar(EmptyStr); 
    mafFilePath := PWideChar(aFilePath); 
    mafCode  := PWideChar(aCode); 
    mafVersion := PWideChar(aVersion); 

    try 
    AddOnHandle := LoadLibrary(PWideChar(aPath)); 
if (AddOnHandle <> 0) then 
begin 
    @OpenAddOnFile := GetProcAddress(AddOnHandle, 'OpenAddOnFile'); 
    @CloseAddOnFile := GetProcAddress(AddOnHandle, 'CloseAddOnFile'); 

    if (@OpenAddOnFile <> nil) then 
    begin 
    AddOnMainForm := OpenAddOnFile(mafCode, mafFilePath, mafVersion); 
    AddOnMainForm.Position := poScreenCenter; 
    AddOnMainForm.ShowModal; 
    if (@CloseAddOnFile <> nil) then 
    begin 
     CloseAddOnFile(mafCode, mafFilePath, mafQuitPopUp); 
    end; 
    FreeAndNil(AddOnMainForm); 
    Application.ProcessMessages; 
    end; 
end; 

if not (mafQuitPopUp = PWideChar(EmptyStr)) then 
begin 
    ShowMessage(mafQuitPopUp); 
end; 
aFilePath := String(mafFilePath); 
aCode := String(mafCode); 
except 
Result := False; 
end; 
end; 

end. 
+0

是,你可以在C# – 2013-05-13 15:48:47

+1

返回一个指针那么,你是如何加载德尔福一个C#DLL。它是原生的Win32 Delphi还是Delphi.net?而C#中没有'指针'。有'IntPtr'。什么是回报价值?什么是C#应用程序意味着返回?参数指向可修改的缓冲区吗?基本上你的问题完全缺乏需要回答的细节。 – 2013-05-13 15:48:59

+1

还有另一个问题。什么“它不工作的意思”?你的开发工具为你提供包含详细信息的错误消息。你为什么不传递这些信息。你想让我们很难吗?! – 2013-05-13 15:54:58

回答

4

什么你正在尝试是不可能的。你不能在C#中实现一个Delphi表单。您发布的代码将DLL函数返回的指针视为Delphi表单。唯一可以实现Delphi表单的是Delphi编写的代码。

更重要的是,如果DLL在Delphi中实现你的代码甚至无法有效。这是因为主机可执行文件中的TForm类与DLL中的TForm类不同。为了完成你正在尝试做的事情,用Delphi DLL,你需要跨越模块边界传递接口。

的底线是,当前的设计对于这个附加架构不能正常工作。您需要直接回到绘图板并重新开始。

+0

好的,我会告诉他的。那么,是否有可能在没有返回形式指针的情况下执行它,例如没有返回值或只是一个整数,而忽略指针? delphi代码不是我的问题:) – Jannik 2013-05-13 16:30:58

+0

好吧,如果你将显示表单的代码移动到DLL中,那么是的,这是可能的。你仍然需要找到一种方法来从你的C#DLL中创建一个非托管导出。例如Robert Giesecke的UnmanagedExports。 – 2013-05-13 16:42:20

+0

或者,您可以将.NET运行时加载到Delphi应用程序中,并直接托管.NET程序集。然后,您可以通过Delphi的COM interop层与.NET对象通信,使用“OleVariant”来包装.NET对象。这是一项工作,但可以完成。它仍然不会以任何方式或形式成为TForm,但您可以确定地加载.NET对象并调用它们的方法。 – 2013-05-13 16:57:44

1

你可以,也许,以短小的变化在Delphi中的调用程序实现它略有不同。

如果你使用UnmanagedExports(速效作为NuGet包)由大卫提到你能拿OpenAddonFile调用返回的接口,而不是形式。该界面可以实现ShowModal和Position。
CloseAddonFile可以正常返回适当的值。无论如何,无论是形成控制台应用程序还是其他任何内容,只要您可以调用ShowModal即可。

我已经找到了UnmanagedExports是非常好的,只要你从方法记住,只能返回INT /无效类型和任何字符串返回VAR /输出参数。

相关问题