2013-05-13 98 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 /輸出參數。

相關問題