Проблема получения правильных параметров для C # P / Вызов вызова C ++ dll

2

Попытка 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 используется здесь).
Итак, есть ли более научный способ сделать это, кроме проб и ошибок?
Джим

  • 0
    Вы пробовали pinvoke.net ?
  • 0
    961 - это 3C1 в гексе. Это определяется в sccerr.h как «Нарушение прав доступа»
Теги:
pinvoke

1 ответ

0
Лучший ответ

Вы можете выполнить поиск http://pinvoke.net для существующего решения, или вы можете попробовать Инструмент подписи PInvoke. Они могут оказать некоторую помощь.

  • 0
    Да, использовали ToolKit, но это все еще игра в догадки
  • 0
    @ Джим: Никаких аргументов от меня на этот счет. Может быть действительно трудно получить правильные подписи. Я часто прибегаю к написанию некоторых оболочек в C ++ / CLI, а затем выставляю их на C #.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню