如何将包含文件路径的字符串从 C# 传递到需要 PChar 参数的 Pascal DLL 中的函数?
How to pass a string containing a file path from C# to a function in a Pascal DLL requiring a PChar argument?
如何将包含文件路径的字符串从 C# 传递到需要 PChar 参数的 Pascal DLL 中的函数?
Pascal DLL 有一个 "FileExists" 调用,用于检查参数 (AFile: PChar) 是否作为文件存在。
我已经像这样成功导入了 dll:
[DllImport(pcsm,
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Unicode,
EntryPoint = "PCS")]
并声明函数如下:
public static extern int PCSM([MarshalAs(UnmanagedType.BStr)] string AFile);
然后在 Pascal 中:
function PCS(AFile: PChar): PChar; stdcall;
var XD: IXMLDocument;
Race: TPCSRace;
begin
try
if not FileExists(AFile) then
raise EFOpenError.CreateFmt('File "%s" not found', [AFile]);
else
//do something with AFile...
end
但是当我这样调用函数时:
pascalPath = "path\to\the\file";
PCSM(pascalPath);
Dll 不对该文件进行操作(它必须被编辑并且它是一个 xml 文件)。
Dll是某机构官方提供的,无法编辑,我减少了代码,但Dll是正确的。
已解决
[DllImport(pcsm,
CallingConvention = CallingConvention.Winapi,
CharSet = CharSet.Ansi,
EntryPoint = "PCS")]
public static extern int PCS(string AFile);
然后
StringBuilder pascalPath = new StringBuilder(xmlPath, xmlPath.Length);
int result = PCS(pascalPath.ToString());
如何将包含文件路径的字符串从 C# 传递到需要 PChar 参数的 Pascal DLL 中的函数?
Pascal DLL 有一个 "FileExists" 调用,用于检查参数 (AFile: PChar) 是否作为文件存在。 我已经像这样成功导入了 dll:
[DllImport(pcsm,
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Unicode,
EntryPoint = "PCS")]
并声明函数如下:
public static extern int PCSM([MarshalAs(UnmanagedType.BStr)] string AFile);
然后在 Pascal 中:
function PCS(AFile: PChar): PChar; stdcall;
var XD: IXMLDocument;
Race: TPCSRace;
begin
try
if not FileExists(AFile) then
raise EFOpenError.CreateFmt('File "%s" not found', [AFile]);
else
//do something with AFile...
end
但是当我这样调用函数时:
pascalPath = "path\to\the\file";
PCSM(pascalPath);
Dll 不对该文件进行操作(它必须被编辑并且它是一个 xml 文件)。
Dll是某机构官方提供的,无法编辑,我减少了代码,但Dll是正确的。
已解决
[DllImport(pcsm,
CallingConvention = CallingConvention.Winapi,
CharSet = CharSet.Ansi,
EntryPoint = "PCS")]
public static extern int PCS(string AFile);
然后
StringBuilder pascalPath = new StringBuilder(xmlPath, xmlPath.Length);
int result = PCS(pascalPath.ToString());