Thank you for fast answer. Unfortunately the "fosdk" library is from vendor and I can't change that. The values of parameters are non-issue, I was lost with the declaration of callback function and passing the function to FOSDKSetCallback.
I defined my own delegate (or copied from example I found from documentation): Imports System Imports System.Runtime.InteropServices public class MyDeleg Public Delegate Function MyCallback(ByVal pCBContext As Integer, ByVal SampleTime As Double, _ ByVal pBuf As IntPtr, ByVal lBufferSize As Integer) As Integer End Class Compiled it and all seemed go OK until the conversion to Int64, so I got to this: from System.Runtime.InteropServices import Marshal FOSDKSetCallback(0, Marshal.GetFunctionPointerForDelegate(MyDelegate(myCallback)).ToInt64(), 0) Seems pretty ok for now, next I've to figure out how to get the whole system working and start receiving callbacks, but that's different problem.. Some more VB.NET samples: 'Delgate for callback function Public Delegate Function MyCallback(ByVal pCBContext As Integer, ByVal SampleTime As Double, _ ByVal pBuf As IntPtr, ByVal lBufferSize As Integer) As Integer <snip> Private cb As MyCallback 'If the callback is called asynchronously, you have to ensure that the 'callback delegate is alive as long as the function poitner is needed. <snip> cb = AddressOf MyCallbackFunc <snip> FosdkApi.FOSDKSetCallback(g_iCrntCam, cb, 12) <snip> Public Function MyCallbackFunc(ByVal pCBContext As Integer, ByVal SampleTime As Double, _ ByVal pBuf As IntPtr, ByVal lBufferSize As Integer) As Integer sTime = SampleTime bSize = lBufferSize ThreadPool.QueueUserWorkItem(AddressOf ShowCallbackMsg) ' show messages in a seperate thread Return 1 End Function On Tue, Mar 4, 2008 at 9:24 PM, Dino Viehland <[EMAIL PROTECTED]> wrote: > Calling it isn't really the interesting part, the interesting part is what > arguments do you pass to it. > > To call it you just need to import the class that the function is defined > in. You can do that using: > > import clr > clr.AddReference('VBAssemblyName') > from VBNamespaceName import * > > where VBAssemblyName is the name of the VB assembly and VBNamespaceName is > the name of the namespace this type lives in. From there you should be able > to do: > > VBTypeName.FOSDKSetCallback(...) > > Then the question becomes what do you pass for nCamIndex, pCallbackFunc, and > pCBContext. > > But before we go there there's a few interesting things about the > signatures. First is that they're declared as taking Int64's instead of > IntPtr's. If this is your own DLL then you probably want to change these to > IntPtrs so they're passing the right size data on both 32-bit and 64-bit > platforms. Then your callback function would look something like: > > Public Declare Function FOSDKSetCallback Lib "FOSDK" (ByVal nCamIndex As > IntPtr, ByVal pCallbackFunc As Long, ByVal pCBContext As IntPtr) As Long > > The 2nd oddity is that pCallbackFunc is not taking a delegate. That means > you'll need to manually call Marshal.GetFunctionPointerForDelegate on a > delegate object. Which also means you're going to need to manually construct > the delegate object. Again if you can change the signature you probably want > to have this taking a delegate typed something like (using the C# syntax > here): > > delegate int MyDelegate(IntPtr pContext, double sampleTime, IntPtr pBuf, int > lBufferSize); > > Then your VB function would end up looking something like: > > Public Declare Function FOSDKSetCallback Lib "FOSDK" (ByVal nCamIndex As > Long, ByVal pCallbackFunc As MyDelegate, ByVal pCBContext As IntPtr) As Long > > >From there you should be able to do: > > def myCallback(context, sampleTime, buffer, bufferSize): > print context, sampleTime, buffer, bufferSize > > from System import IntPtr > FOSDKSetCallback(0, myCallback, IntPtr.Zero) > > The only interesting thing then is what you need to pass in for nCamIndex, > hopefully the library documentation will explain that :) > > If you can't change the signature you'll still need to define the delegate > type somewhere (which you can't do from IronPython). Then your call will > probably end up looking like: > > from System import Marshal, Int64 > FOSDKSetCallback(0, > Int64(Marshal.GetFunctionPointerForDelegate(MyDelegate(myCallback))), 0) > > > > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Harri > Vartiainen > Sent: Tuesday, March 04, 2008 9:24 AM > To: users@lists.ironpython.com > Subject: [IronPython] Using callback function > > Hi, > > I'm trying to use callback function of dll. The API has VB.NET > definition for callback: > > Public Class FosdkApi > ... > ' set callback function > 'FOSDKLIB_API BOOL WINAPI FOSDKSetCallback(IN INT nCamIndex, > ' IN INT (CALLBACK > *pCallbackFunc)(VOID *pContext, DOUBLE SampleTime, BYTE *pBuf, LONG > lBufferSize) > ' > IN VOID *pCBContext); > > Public Declare Function FOSDKSetCallback Lib "FOSDK" (ByVal > nCamIndex As Long, ByVal pCallbackFunc As Long, ByVal pCBContext As > Long) As Long > > Help(FosdkApi.FOSDKSetCallback) prints: > > Help on built-in function FOSDKSetCallback > > | FOSDKSetCallback(...) > | Int64 FOSDKSetCallback(Int64 nCamIndex, Int64 > pCallbackFunc, Int64 pCBContext) > > So how I can use that? > _______________________________________________ > Users mailing list > Users@lists.ironpython.com > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > _______________________________________________ > Users mailing list > Users@lists.ironpython.com > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > _______________________________________________ Users mailing list Users@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com