Здравствуйте. Я работаю над созданием системы автоматизации ввода отсканированных данных в Каталогизатор (место работы - г. Саратов, библиотека СГК; нам приходится расписывать оглавления статей в сборниках, музыкальных журналах и др.). Недавно решил для курсового проекта переписать имеющуюся часть на C# и прикрутить к ней оболочку для доступа к БД IRBIS64. Спасибо Александру Иосифовичу за то, что оперативно среагировал на просьбу и отослал мне эту dll. Я уже набросал каркас оболочки, внешне похожей на Каталогизатор. Но возникает ряд вопросов:
1. Из какого файла считывается имя базы данных, открывающейся автоматически в начале работы на стороне клиента? В файле Cirbisc.ini строка DBN=IBIS автоматически изменяется на DBN= сразу после запуска Каталогизатора, а без него из моей программы, будучи запущенной на машине сервера, не происходит регистрация. Считывать irbisc.ini с помощью функции IC_getresourse()? Подскажите формат вызова. Как получить список всех доступных БД на стороне клиента?
2. С чем может быть связано то, что текст отдельных записей не выводится? Например, запись с номером 260 из тестовой базы IBIS выводится как
"x"
(насколько я понимаю, это набор символов "x\0\0"). Код для вывода записи используется следующий:
string text;
IntPtr record;
...
dbAccess.ReadRecord(index + 1, ref record);
text = dbAccess.PCharToString(record);
...
if (selected)
{
ShowTable();
richTextBox1.Text = text;
}
public int ReadRecord(int id, ref IntPtr record)
{
record = Marshal.AllocHGlobal(32000);
int result = IRBIS64_Client.IC_read(dbName, id, 0, out record, 32000);
return result;
}
public string PCharToString(IntPtr rp)
{
byte[] textBytes = new byte[32000];
Marshal.Copy(rp, textBytes, 0, 32000);
byte[] textAnsiArray = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(1251), textBytes);
string result = Encoding.GetEncoding(1251).GetString(textAnsiArray);
StringBuilder finalString = new StringBuilder();
for (int i = 0; i < result.Length && result[i] != '\0'; i++)
finalString.Append(result[i]);
return finalString.ToString();
}
[DllImport("irbis64_client",
EntryPoint = "IC_read",
ExactSpelling = true,
CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.StdCall)]
//чтение записи
public static extern int IC_read(
string Adbn,
int Amfn, int Alock,
out IntPtr answer, int abufsize);
3. Можно ли средствами irbis64_client.dll получить оформление записи с разметкой в виде каталожной карточки (как в окне Полное описание в правом нижнем углу Каталогизатора)?