Попытка взаимодействия функциональности из API Outside In от Oracle.
Имеют следующую функцию:
SCCERR EXOpenExport {VTHDOC hDoc, VTDWORD dwOutputId, VTDWORD dwSpecType,
VTLPVOID pSpec, VTDWORD dwFlags, VTSYSPARAM dwReserved, VTLPVOID pCallbackFunc,
VTSYSPARAM dwCallbackData, VTLPHEXPORT phExport);
Из заголовочных файлов я сократил параметры до:
typedef VTSYSPARAM VTHDOC, VTLPHDOC *
typedef DWORD_PTR VTSYSPARAM
typedef unsigned long DWORD_PTR
typedef unsigned long VTDWORD
typedef VTVOID* VTLPVOID
#define VTVOID void
typedef VTHDOC VTHEXPORT, *VTLPEXPORT
These are for 32 bit windows
Просматривая файлы заголовков, примеры программ и документацию, которую я нашел:
1. Этот pSpec может быть указателем на буфер или NULL, поэтому я установил его в IntPtr.Zero (документация).
2. Что dwFlags и dwReserved согласно документации «Должно быть установлено разработчиком на 0».
3. Этот pCallbackFunc может быть установлен в NULL, если я не хочу обрабатывать обратные вызовы.
4. То, что последние два основаны на структурах, которые я написал для оболочек C # для использования [StructLayout (LayoutKind.Sequential)]. Затем установил экземпляр и сгенерировал параметры, сначала создав IntPtr с Marshal.AllocHGlobal (Marshal.SizeOf (instance)), затем получив значение адреса, которое передается как uint для dwCallbackData и IntPtr для phExport.
Окончательный список параметров выглядит следующим образом:
1. phDoc как IntPtr, который был загружен адресом с помощью функции DAOpenDocument
до этого.
2. dwOutputId в качестве значения uint, установленного на 1535, который представляет FI_JPEGFIF
3. dwSpecType как int установлен в 2, что представляет IOTYPE_ANSIPATH
4. pSpec как IntPtr.Zero, где вывод будет записан
5. dwFlags в качестве uint, установленного на 0, как указано
6. dwReserved как uint, установленный в 0, как указано
7. pCallbackFunc as IntPtr установлен в NULL, так как я буду обрабатывать результаты
8. dwCallBackDate as uint адрес буфера для структуры
9. phExport как IntPtr в другой структурный буфер
все еще получает неопределенную ошибку от API. Это означает, что вызов возвращает 961, который не определен ни в одном из заголовочных файлов. В прошлом я получал это, когда мой выбор типов параметров неверен.
Я начал с Interop Assistant, который помог мне узнать, сколько типов параметров переводится. Однако это ограничено тем, насколько хорошо я могу выбрать правильный нативный тип из заголовочных файлов. Например, параметр hDoc, использованный в предыдущей функции, был определен как дескриптор нефайловой системы, поэтому попытался использовать Marshal для создания дескриптора, затем использовал IntPtr, и, наконец, он оказался int (фактически это был & phDoc, использованный здесь ).
Так есть ли более научный способ сделать это, кроме проб и ошибок?
Jim