public static unsafe bool Request(string api, StringBuilder input, string api_type) { if (!ServerConnected) { MessageBox.Show("Небходимо соединиться с сервером", "Предупреждение", MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } // EQGateRequest ========================================= EQGateStatus = -1; uint temp_DSC; temp_DSC = 0; temp_DSC = EQGATE_DESCRIPTOR; // строка, заканчивающаяся нулевым символом, содержащая имя вызываемой функции. if (api == "") { return(false); } StringBuilder sb_api = new StringBuilder(7); sb_api = sb_api.Append(api); sb_api = sb_api.Append("\0"); // строка, заканчивающаяся нулевым символом, содержащая идентификатор сессии, в рамках которой будет осуществлен вызов функции Equation. StringBuilder sb_session_id = new StringBuilder(26); sb_session_id = sb_session_id.Append(SessionID); sb_session_id = sb_session_id.Append("\0"); // строка, заканчивающаяся нулевым символом, содержащая входные параметры функции Equation. StringBuilder sb_input = new StringBuilder(2); sb_input = input; sb_input = sb_input.Append("\0"); //sb_input = input; // user = 10 // Pass =10 // мнемоника блока = 3 - имя блока // указатель на область памяти, куда будет скопирована информация об ошибках и/или предупреждениях, возникших во время выполнения функции Equation (см. примечание). StringBuilder sb_ksm = new StringBuilder(EQGATE_KSM_SIZE); // указатель на область памяти, куда будет принята строка, содержащая выходные параметры функции Equation. StringBuilder sb_output = new StringBuilder(EQGATE_OUTPUT_SIZE); // указатель на область памяти, где содержится управляющая информация для функций, поддерживающих возврат набора (переменной длины) записей (см. примечание). Данный параметр содержит как входные, так и выходные параметры (используется как для чтения, так и для записи). int msc_size = 0; StringBuilder sb_mcs = new StringBuilder(0); sb_mcs = null; if (api_type == "list") { msc_size = EQGATE_MCS_SIZE; sb_mcs = new StringBuilder(msc_size); sb_mcs = sb_mcs.Append(mcs_QueryType.ToString()); // sb_mcs = sb_mcs.Append(EQGateDLL.InsertZero(Convert.ToString(mcs_RecordsRequested), 4)); // sb_mcs = sb_mcs.Append("00000"); // sb_mcs = sb_mcs.Append("\0"); } try { EQGateStatus = EqGate.EQGateDLL.EQGateRequest( &temp_DSC, sb_api, sb_session_id, sb_input, sb_ksm, sb_ksm.Capacity, // размер области памяти в байтах, на которую указывает параметр ksm. sb_output, sb_output.Capacity, // размер области памяти в байтах, на которую указывает параметр output. sb_mcs, // указатель на область памяти, где содержится управляющая информация для функций, поддерживающих возврат набора (переменной длины) записей (см. примечание). Данный параметр содержит как входные, так и выходные параметры (используется как для чтения, так и для записи). msc_size // размер области памяти в байтах, на которую указывает параметр mcs. );; } catch { MessageBox.Show("Error call [EQGateRequest]", "Error EQGateRequest", MessageBoxButtons.OK, MessageBoxIcon.Error); } Get_ksm_array(sb_ksm); if (EQGateStatus != 0) { //MessageBox.Show(GetEQGateStatus(EQGateStatus), "EQGateStatus", MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } RequestOutput = sb_output; RequestOutputCurrentLength = 0; if (api_type == "list") { mcs_QueryType = Convert.ToInt32(sb_mcs.ToString(0, 1)); mcs_RecordsRequested = Convert.ToInt32(sb_mcs.ToString(1, 4)); mcs_RecordsReturned = Convert.ToInt32(sb_mcs.ToString(5, 4)); mcs_NotFinished = Convert.ToInt32(sb_mcs.ToString(9, 1)); } return(true); }