Problem getting correct parameter types for P/Invoke call

Announcements and discussion for PInvoke

Moderators: Luke Jefferson, Robert

Problem getting correct parameter types for P/Invoke call

Postby jjones7947 » Wed Mar 17, 2010 2:14 pm

Trying to Interop a functionality from the Outside In API from Oracle.
Have the following function:
Code: Select all
 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
    Documentation says that this type is a non-filesystem handle
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 instantiated 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:
Code: Select all
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. By that I mean that when I call the function through P/Invoke it returns 961 which does not correlate to any of the errors defined in the header files. Past experience says that I get this result when my choice of parameter types is incorrect.
Jim
jjones7947
 
Posts: 2
Joined: Wed Mar 17, 2010 1:49 pm

Postby Paul.Martin » Thu Mar 18, 2010 4:10 pm

I've not used the Oracle Outside In API so I can't say with any confidence, but looking at the specification - if you set pSpec to NULL (IntPtr.Zero) you need to pass a callback function in pCallbackFunc that will handle a dwCommandID of EX_CALLBACK_ID_CREATENEWFILE.
Paul.Martin
 
Posts: 83
Joined: Wed Feb 03, 2010 11:20 am
Location: Cambridgeshire

Postby jjones7947 » Thu Mar 18, 2010 7:11 pm

Ok will give that a try
jjones7947
 
Posts: 2
Joined: Wed Mar 17, 2010 1:49 pm

Postby Paul.Martin » Mon Mar 29, 2010 5:24 pm

Did you get any success with this?
Paul.Martin
 
Posts: 83
Joined: Wed Feb 03, 2010 11:20 am
Location: Cambridgeshire


Return to PInvoke.Net

Who is online

Users browsing this forum: No registered users and 0 guests