在Delphi XE6中调用c# dll函数存在访问冲突
本文关键字:dll 函数 存在 访问冲突 调用 Delphi XE6 | 更新日期: 2023-09-27 18:06:18
在将项目从Delphi 2007迁移到XE6之后,我们不再能够正确调用我们构建的c# dll中的导出函数。c#代码似乎执行得很好,做了它应该做的事情,但是在它完成之后,它抛出了一个访问冲突。
代码:
Result := False;
lib := LoadLibrary('KJPDFExport.dll');
if lib = 0 then RaiseLastOSError;
try
try
@prc := GetProcAddress(lib, 'ExportOffice');
if Assigned(prc) then
begin
Result := prc(sourceFile,
ChangeFileExt(destinationFile, ''),
pdfBackgroundHeadFile,
pdfBackgroundSubFile);
end
else
ShowMessage('ExportOffice not found in KJPDFExport.dll');
except
on e:Exception do
begin
ShowMessage(e.Message);
end;
end;
finally
FreeLibrary(lib);
end;
我传递给c#函数的字符串都是ansistring。在项目的2007版本中,它们曾经只是"字符串",因此我将它们更改为AnsiString。
我很困惑,我找了好几个小时都没找到问题所在。
结果证明它一直有效。Delphi调试器不知道如何处理c#异常。即使在c#的throw语句周围有try/catch语句,Delphi调试器仍然会将其视为访问冲突。当你只是简单地按下继续它的工作。崩溃的原因是另一段代码必须转换为使用AnsiString。
是否尝试使用本地ansiString变量?ChangeFileExt()返回字符串值。
类似这样:
var sIn, sOut : ansiString;
Result := False;
sIn := ansiString(sourceFile);
sOut := ansistring(ChangeFileExt(destinationFile, ''));
lib := LoadLibrary('KJPDFExport.dll');
if lib = 0 then RaiseLastOSError;
try
try
@prc := GetProcAddress(lib, 'ExportOffice');
if Assigned(prc) then
begin
Result := prc(Sin,
sOut,
pdfBackgroundHeadFile,
pdfBackgroundSubFile);
end
else
ShowMessage('ExportOffice not found in KJPDFExport.dll');
except
on e:Exception do
begin
ShowMessage(e.Message);
end;
end;
finally
FreeLibrary(lib);
end;