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);
}
}