using System.Runtime.InteropServices; using System.Text; namespace EdiApiGateway.Services; /// /// ACMSCTL1.DLL P/Invokeラッパー(クライアントモード) /// /// /// ACMS DLLからのメッセージはShift-JISエンコーディングで返されるため、 /// byte配列で受け取り、呼び出し側で明示的にShift-JIS → UTF-8変換を行う必要があります。 /// public static class AcmsApiWrapper { private const int MSG_BUFFER_SIZE = 256; [DllImport("ACMSCTL1.DLL", CharSet = CharSet.Ansi)] public static extern int ACMSCallSend( [MarshalAs(UnmanagedType.LPStr)] string uid, [MarshalAs(UnmanagedType.LPStr)] string fid, [MarshalAs(UnmanagedType.LPStr)] string fname, int cycle, [MarshalAs(UnmanagedType.LPArray, SizeConst = MSG_BUFFER_SIZE)] byte[] msg); [DllImport("ACMSCTL1.DLL", CharSet = CharSet.Ansi)] public static extern int ACMSCallRecv( [MarshalAs(UnmanagedType.LPStr)] string uid, [MarshalAs(UnmanagedType.LPStr)] string fid, [MarshalAs(UnmanagedType.LPStr)] string fname, int cycle, int denbun, [MarshalAs(UnmanagedType.LPArray, SizeConst = MSG_BUFFER_SIZE)] byte[] msg); [DllImport("ACMSCTL1.DLL", CharSet = CharSet.Ansi)] public static extern int ACMSCallSendNoDisc( [MarshalAs(UnmanagedType.LPStr)] string uid, [MarshalAs(UnmanagedType.LPStr)] string fid, [MarshalAs(UnmanagedType.LPStr)] string fname, int cycle, [MarshalAs(UnmanagedType.LPArray, SizeConst = MSG_BUFFER_SIZE)] byte[] msg); [DllImport("ACMSCTL1.DLL", CharSet = CharSet.Ansi)] public static extern int ACMSCallRecvNoDisc( [MarshalAs(UnmanagedType.LPStr)] string uid, [MarshalAs(UnmanagedType.LPStr)] string fid, [MarshalAs(UnmanagedType.LPStr)] string fname, int cycle, int denbun, [MarshalAs(UnmanagedType.LPArray, SizeConst = MSG_BUFFER_SIZE)] byte[] msg); [DllImport("ACMSCTL1.DLL", CharSet = CharSet.Ansi)] public static extern int ACMSCallStartup( [MarshalAs(UnmanagedType.LPStr)] string uid, [MarshalAs(UnmanagedType.LPArray, SizeConst = MSG_BUFFER_SIZE)] byte[] msg); [DllImport("ACMSCTL1.DLL", CharSet = CharSet.Ansi)] public static extern bool ACMSCallAdd( [MarshalAs(UnmanagedType.LPStr)] string uid, [MarshalAs(UnmanagedType.LPStr)] string fid, [MarshalAs(UnmanagedType.LPStr)] string fname, int sndrcv, int cycle, int denbun, [MarshalAs(UnmanagedType.LPArray, SizeConst = MSG_BUFFER_SIZE)] byte[] msg); [DllImport("ACMSCTL1.DLL", CharSet = CharSet.Ansi)] public static extern int ACMSCallExecute( int handle, int reserved, ref int fnum, [MarshalAs(UnmanagedType.LPArray, SizeConst = MSG_BUFFER_SIZE)] byte[] msg); [DllImport("ACMSCTL1.DLL", CharSet = CharSet.Ansi)] public static extern bool ACMSInitCallInfo( [MarshalAs(UnmanagedType.LPArray, SizeConst = MSG_BUFFER_SIZE)] byte[] msg, int handle); /// /// ACMS API用のメッセージバッファを作成 /// /// 256バイトのbyte配列 public static byte[] CreateMessageBuffer() => new byte[MSG_BUFFER_SIZE]; /// /// ACMS APIから返されたメッセージバッファをShift-JISからUTF-8文字列に変換 /// /// ACMS APIから返されたバッファ /// UTF-8文字列 public static string DecodeMessage(byte[] msgBuffer) { // Shift-JISエンコーディング取得 var shiftJis = Encoding.GetEncoding("Shift_JIS"); // null終端文字を探す int length = Array.IndexOf(msgBuffer, (byte)0); if (length < 0) length = msgBuffer.Length; // Shift-JIS → UTF-8変換 return shiftJis.GetString(msgBuffer, 0, length); } }