Попытка Interop функциональности от внешнего API от 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. Что последние два основаны на структурах, которые я написал обертками С# для использования [StructLayout (LayoutKind.Sequential)]. Затем инициализировал экземпляр и сгенерировал параметры, сначала создав IntPtr с Marshal.AllocHGlobal(Marshal.SizeOf(экземпляр)), затем получив значение адреса, которое передается как 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 как IntPtr установлен в NULL, так как я буду обрабатывать результаты
8. dwCallBackDate как uint адрес буфера для структуры
9. phExport как IntPtr в другой буфер структуры
все еще получают ошибку undefined от API. Это означает, что вызов возвращает 961, который не определен ни в одном из файлов заголовков. Раньше я получал это, когда мой выбор типов параметров неверен.
Я начал использовать Interop Assistant, который был полезен для изучения того, как много типов параметров переводится. Однако он ограничен тем, насколько хорошо я могу получить правильный родной тип из файлов заголовков. Например, параметр hDoc, используемый в предыдущей функции, был определен как дескриптор non-fileytem, поэтому попытался использовать маршал для создания дескриптора, затем использовал IntPtr, и, наконец, он оказался int (на самом деле это был & phDoc используется здесь).
Итак, есть ли более научный способ сделать это, кроме проб и ошибок?
Джим
Вы можете выполнить поиск http://pinvoke.net для существующего решения, или вы можете попробовать Инструмент подписи PInvoke. Они могут оказать некоторую помощь.