Jim Jones

Jim Jones

  • NA
  • 10
  • 0

Problem getting correct parameter types for P/Invoke call

Mar 16 2010 12:24 PM

Trying to Interop a functionality from the Outside In API from Oracle.
Have the following function:
 SCCERR EXOpenExport {
    VTHDOC    hDoc,
    VTDWORD    dwOutputId,
    VTDWORD    dwSpecType,
    VTLPVOID    pSpec,
    VTDWORD    dwFlags,
    VTSYSPARAM    dwReserved,
    VTLPVOID    pCallbackFunc,
    VTSYSPARAM    dwCallbackData,
    VTLPHEXPORT    phExport);

From the header files I reduced the parameters to:
 
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
 

Going through the header files, the example programs, and the documentation I found:
  1. That pSpec could be a pointer to a buffer or NULL, so I set it to a IntPtr.Zero (documentation).
  2. That dwFlags and dwReserved according to the documentation "Must be set by the developer to 0".
  3. That pCallbackFunc can be set to NULL if I don't want to handle callbacks.
  6. That the last two are based on structs that I wrote C# wrappers for using the [StructLayout(LayoutKind.Sequential)]. Then instatiated an instance and generated the parameters by first creating a IntPtr with Marshal.AllocHGlobal(Marshal.SizeOf(instance)), then getting the address value which is passed as a uint for dwCallbackData and a IntPtr for phExport.
The final parameter list is as follows:
phDoc as a IntPtr which was loaded with an address by the DAOpenDocument function called before
dwOutputId as uint set to 1535 which represents FI_JPEGFIF                                    
dwSpecType as int set to 2 which represents IOTYPE_ANSIPATH
pSpec as an IntPtr.Zero where the output will be written
dwFlags as uint set to 0 as directed
dwReserved as uint set to 0 as directed
pCallbackFunc as IntPtr set to NULL as I will handle results
dwCallBackDate as uint the address of a buffer for a struct
phExport as IntPtr to another struct buffer

still get an undefined error from the API.
Jim

Answers (2)