C#のPowerbuilder ORCA Apiを使用しようとしていますが、マーシャリングに問題があります。これがORCAApiのCヘッダーファイルです。pborca_scc構造体を必要とするPBORCA_SccGetConnectProperties関数を実装しようとしています。これが私の定義です:
[DllImport(OrcaModule, CharSet = CharSet.Auto)]
internal static extern int PBORCA_SccGetConnectProperties(IntPtr ORCASession,
[MarshalAs(UnmanagedType.LPWStr)] string Workspace,
ref OrcaSccInfo SCCInfo);
public delegate int TextOutDelegate(
[MarshalAs(UnmanagedType.LPWStr)] string data,
int userData);
public delegate void BuildProjectDelegate(
OrcaBuildError BuildError,
IntPtr userData);
[StructLayout(LayoutKind.Sequential)]
public sealed class OrcaSccInfo
{
internal IntPtr Wnd = IntPtr.Zero;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
internal string ProviderName = null;
internal int Capabilities = 0;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
internal string UserID = null;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 301)]
internal string Project = null;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 301)]
internal string LocalProjPath = null;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 301)]
internal string AuxPath = null;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 301)]
internal string LogFile = null;
internal TextOutDelegate SccMsgHandler = null;
internal BuildProjectDelegate OrcaMsgHandler = null;
internal int lCommentLen = 0;
internal int lAppend = 0;
internal IntPtr CommBlk = IntPtr.Zero;
internal int DeleteTempFiles = 0;
}
このように関数を呼び出す場合:
ret = Interop.PBORCA_SccGetConnectProperties(session.Handle,
@"D:\PB11-test\test.pbw",
ref scc);
マーシャリングエラーが原因である可能性があるというメッセージを含むFatalExecutionEngineErrorを受け取りました。私はこれを何度も繰り返しましたが、関数、構造体、またはデリゲートをマーシャリングする方法でどこを間違えているのかがわかりません。