【发布时间】:2016-02-23 23:38:02
【问题描述】:
我正在尝试从 C# 调用几个 Delphi 函数:
MyType =array [1 .. 124] of byte
procedure f(bytes: MyType); stdcall;
external 'my.dll' name 'f';
这是我的第一个问题。我试过了:
[DllImport("Delphi/my.dll",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Auto)]
public static extern
void sygLadSyg([MarshalAs(UnmanagedType.LPArray)] byte[] myArray);
void sygLadSyg([MarshalAs(UnmanagedType.SafeArray)] byte[] myArray);
我得到异常:
对 PInvoke 函数的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
我做错了什么?
第二个问题是传递位图。
function sygAnaliz(bitmapa: TBitmap): byte; stdcall;
external 'awSygnat1.dll' name 'sygAnaliz';
[DllImport("Delphi/awSygnat1.dll",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern
byte sygAnaliz(IntPtr bitmapPtr);
// and call itself
sygAnaliz(firstIMG.GetHbitmap());
我得到异常: 尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
这两个函数肯定是内存安全的,因为它们已经使用了几年,效果很好。也许我想念一些明显的东西?
【问题讨论】:
-
对于数组,Remy's andwers 也允许你使用 bytes[1]:=6; Delphi 函数内部。
标签: c# delphi bitmap interop marshalling