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: [email protected]
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
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com