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

Попытка взаимодействия функциональности из 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

1 Ответ

0 голосов
/ 05 апреля 2010

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

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