【发布时间】:2013-12-16 13:27:09
【问题描述】:
我正在尝试使用来自 C# VS2013 程序的 Pinvoke 来访问现有的 DelphiXE2 dll 程序。 Delphi 程序获取一个 xml 文件和一个 IB 数据库文件,并根据 xml 文件更新数据库。 DelphiXE2 dll 程序被另一个 Delphi 程序成功调用。在 C# 中,我试图调用 GETxml 程序。我收到 {"External component has throw an exception."} 错误。
由于我是 C# 和 DELPHI 的新手,因此我需要对我正在尝试执行的操作进行语法检查。
C#
[DllImport("MSA.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, EntryPoint = "GetXML")]
extern static int GetXML([MarshalAs(UnmanagedType.LPStr)] string a, [MarshalAs(UnmanagedType.LPStr)] string b, Boolean c);
int retval = 0;
retval = GetXML(txtPath.Text.ToString().Trim(), txtCabFile.Text.ToString().Trim(), false);
现有的Delphi程序:(我注意到这个dll函数中没有发生数据库打开。实际上它发生在调用GetXML之前的调用Delphi程序中。不确定这是否是一个问题,因为我是从 C# 程序调用。)
function GetXML(DatabasePath: pChar; OFileName: pChar; Silent: Boolean = True): Integer; stdcall;
var
xmlDatabase: TIBDatabase;
xmlTransaction: TIBTransaction;
objXML: TXML;
begin
Result := -1;
if FileExists(oFilename) then
begin
objXML := nil;
xmlDatabase := nil;
try
xmlDatabase := TIBDatabase.Create(nil);
xmlTransaction := TIBTransaction.Create(xmlDatabase);
xmlTransaction.DefaultDatabase := xmlDatabase;
xmlDatabase.DatabaseName := DatabasePath;
xmlDatabase.Params.Add('user_name=SYSTASS');
xmlDatabase.Params.Add('password=pswdf88');
xmlDatabase.LoginPrompt := False;
xmlDatabase.DefaultTransaction := xmlTransaction;
xmlDatabase.Connected := True;
xmlTransaction.StartTransaction;
try
objXML := TXML.Create(XMLDatabase, IsSecGDB(XMLDatabase)); //uses IBQUERY to start transaction
objXML.XMLIntoDB(oFilename, Silent);
xmlTransaction.Commit;
result := 1;
except
on e: Exception do
begin
xmlTransaction.Rollback;
raise Exception.Create('GetXML Exception: ' + e.Message);
end;
end;
finally
FreeAndNil(objXML);
if xmlDatabase <> nil then
xmlDatabase.Close;
FreeAndNil(xmlDatabase);
end;
结束 别的 开始 raise Exception.Create('Filename ' + oFilename + ' 未找到参数。'); 结尾; 结束;
【问题讨论】:
-
为什么写
int retval = 0; retval = GetXML(...);?当然你的意思是int retval = GetXML(...); -
是的,改了。谢谢。
标签: c# delphi pinvoke delphi-xe2