一个朋友问我关于用 C# 为一个 delphi 应用程序编写一个 dll。他想使用这个函数 decleration 与它通信:
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.