Как реализовать ehllapi в C # - PullRequest
0 голосов
/ 09 марта 2019

Я работаю с IBM i Access Client Solution и должен реализовать некоторые функции ehllapi.dll для взаимодействия с экраном grean.

В нем есть документ IBM в по этой ссылке и некоторые полезные примеры кода в по этой ссылке . В примере кода реализованы некоторые простые функции, и он работал отлично, но я не могу найти способ, как реализовать функцию, которая должна передавать строку данных, содержащую конкретные данные для каждого байта, в метод интерфейса, который был реализован в источнике примера код. (как Функция состояния окна )

Кто-нибудь может мне помочь? Как я могу создать строку данных для передачи в интерфейс кода C # ниже?

public class EhllapiFunc
{
    [DllImport("PCSHLL32.dll")]
    public static extern UInt32 hllapi(out UInt32 Func, StringBuilder Data, out UInt32 Length, out UInt32 RetC);
}

Спасибо за вашу помощь.

--------------- EDIT1 -----------------------

Я пытался создать параметр буфера данных, используя byte[], как это

byte[] buffer = new byte[28];
buffer[0] = (byte)65     // letter A
buffer[4] = (byte)0x01   // the fifth byte (X'01' for set status)
... 

и затем перейдите в отредактированный прототип

public class EhllapiFunc
{
    [DllImport("PCSHLL32.dll")]
    public static extern UInt32 hllapi(out UInt32 Func, out byte[] Data, out UInt32 Length, out UInt32 RetC);
}

но это не работает! Что-то не так с моим кодом?

--------------- Решение -----------------------

Мне понравилось, как сказал @battlmonstr, и это сработало!

Прототип будет публичный класс EhllapiFunc

{
    [DllImport("PCSHLL32.dll")]
    public static extern UInt32 hllapi(out UInt32 Func, Byte[] Data, out UInt32 Length, out UInt32 RetC);
}

И орудие будет

Byte[] buffer = new Byte[28];   // Byte[]   not byte[]
MemoryStream ms = new MemoryStream(buffer);
BinaryWriter bw = new BinaryWriter(ms); 

bw.Write((Byte)65);             // letter A 
bw.Seek(4, SeekOrigin.Begin);   // jump to 5th byte
bw.Write((Byte)0X01)            // hexa 01

1 Ответ

0 голосов
/ 09 марта 2019

Кажется, что можно создать этот параметр буфера данных, используя MemoryStream + BinaryWriter, вынуть byte[] и передать его в hllapi.Для этого вам нужно изменить прототип так, чтобы он брал byte[] вместо StringBuilder, потому что в случае функции состояния окна это не строка ASCII.В зависимости от того, что вы хотите, состав байтов может быть разным, как описано в вашей последней ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...