I've a problem with PInvoke.I've to invoke a unmanaged dll
fucntion in C# which uses a callback fucntion.Please
apologise for this lenghty message and render ur kind help.
The original dll function and my C# code has been given
below along with the error message.
Error: The return code is 0 which means the fucntion has
executed successfully. But I'm not getting the correct
values in the structure pborcadirentry.
Note: I've tried GC method. But I'm not sure whether I've
applied it appropriately.I've also tried [MarshalAs
(UnmanagedType.Struct)] and [MarshalAs
(UnmanagedType.LPStruct)] for marshaling strcuture ans
class.
But there was no change in the o/p. I feel that there is
some problem with the memory. But I'm unable to detect it.
Please help me
The unmanaged dll fucntion is as follows
****************************************
The Original Fucntion in the dll
****************************************
int PBORCA_LibraryDirectory ( HPBORCA hORCASession, LPSTR
lpszLibName, LPSTR lpszLibComments, int iCmntsBuffSize,
PBORCA_LISTPROC pListProc, LPVOID pUserData );
hORCASession-Handle to previously established ORCA session
pListProc- Pointer to the PBORCA_LibraryDirectory callback
function.
pUserData -Pointer to user data to be passed to the
PBORCA_LibraryDirectory callback function
Given below function is the callback function declaration
in C.
typedef void (FAR PASCAL *PBORCA_LISTPROC) (
PPBORCA_DIRENTRY, LPVOID );
PPBORCA_DIRENTRY -Pointer to the structure
PBORCA_DIRENTRY, described next
LPVOID -Long pointer to user data
The user data strcuture to the callback fucntion is as
follows:
typedef struct ORCA_UserDataInfo
{
LPSTR lpszBuffer; // Buffer for entry info
DWORD dwCallCount; // # of entries in lib
DWORD dwBufferSize; // size of buffer
DWORD dwBufferOffset; // current offset in buffer
} ORCA_USERDATAINFO, FAR *PORCA_USERDATAINFO;
The structure passed to the callback fucntion by the
LibraryDirectory fucntion is as follows:
typedef struct pborca_direntry { CHAR szComments
[PBORCA_MAXCOMMENT + 1];
LONG lCreateTime;
LONG lEntrySize;
LPSTR lpszEntryName;
PBORCA_TYPE otEntryType;} PBORCA_DIRENTRY, FAR
*PPBORCA_DIRENTRY;
Note:PBORCA_TYPE is an enum
***************************************
End of the dll fucntion
***************************************
_________________________________________
C# code
_________________________________________
[StructLayout(LayoutKind.Sequential,CharSet=CharSet .Auto)]
public class UserData
{
public string s;
public uint callcount;
public uint bufsize;
public uint offset;
}
[StructLayout(LayoutKind.Sequential,CharSet=CharSet .Auto)]
public struct pborca_direntry
{
public const int i=255;
[MarshalAs
(UnmanagedType.ByValTStr,SizeConst=i+1)]
public string s;
public System.Int32 time;
public System.Int32 size;
[MarshalAs(UnmanagedType.LPStr)]
public string name;
public int type;
}
public unsafe delegate void Callback(ref pborca_direntry
p,UserData usr);
[DllImport
("pborc80.dll",CharSet=CharSet.Auto,EntryPoint="PB ORCA_Libr
aryDirectory",CallingConvention=CallingConvention. StdCall)]
//...Ansi)]
public static extern int LibraryEntry(int hnd,[MarshalAs
(UnmanagedType.LPStr)]System.String s,[Out]char[] buff,int
se,[MarshalAs(UnmanagedType.FunctionPtr)]Callback
hr,UserData usr);
public class1
{
Callback c = new Callback(Class1.libdircallback);
GC.KeepAlive(code=class3.LibraryEntry
(hnd,"d:\\projects\\current\\tgt3.pbl",st,10000,c, usr));
public unsafe static void libdircallback(ref
pborca_direntry s,UserData usr) {
{
Console.WriteLine("hai,I'm in
callback");
Console.WriteLine
(s.type);
}
}
Thanks in advance,
Vijaya