Click here to Skip to main content
15,895,283 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi all,

Currently I'm working on Blusoleil SDK[^]. I have to create a wrapper for their library.
I have a problem on registering the callback function. The definition is something like this:

C++
--------
Prototype Function:
BTINT32	Btsdk_RegisterGetStatusInfoCB4ThirdParty(
Func_ReceiveBluetoothStatusInfo* statusCBK);

typedef void Func_ReceiveBluetoothStatusInfo(
ULONG usMsgType, ULONG pulData, ULONG param, BTUINT8 *arg);

C#
------
C#
[DllImport("BsSdk.dll")]
        [return: MarshalAs(UnmanagedType.U4)]
        public static extern Int32  Btsdk_RegisterGetStatusInfoCB4ThirdParty(ref Func_ReceiveBluetoothStatusInfo statusCBK);

public delegate void  Func_ReceiveBluetoothStatusInfo (UInt32 usMsgType,UInt32 pulData,UInt32 param, ref Byte arg);

Function to test the call back :
C#
public static void Test_RegisterGetStatusCBK()
        {
            Func_ReceiveBluetoothStatusInfo Bd = BsStatusCBKFuc;
            /* register callback function to get the status change of BlueSoleil. */
            Btsdk_RegisterGetStatusInfoCB4ThirdParty(ref Bd);
            
        }

C#
public static void BsStatusCBKFuc(UInt32 usMsgType, UInt32 pucData, UInt32 param, ref Byte arg)
        {
            /* message received */
            switch (usMsgType)
            {
                case Hndle.BTSDK_BLUETOOTH_STATUS_FLAG:
                    {
                        switch (pucData)
                        {
                            case (uint)BluetoothState.BTSDK_BTSTATUS_TURNON:
                                {
                                    //printf("MSG: Bluetooth is turned on.\n");
                                    MessageBox.Show(@"Bluetooth is turned on");
                                    break;
                                }
                        }
                    }    
              
            }

The problem is, that the callback function doesn't hit anymore. It seem the Btsdk_RegisterGetStatusInfoCB4ThirdParty is not succesfull. Can anyone give me an idea? Was my method wrong?
Posted
Updated 24-Jan-11 20:35pm
v3

1 solution

I think, first bug I can spot is the keyword ref in delegate parameter of [DllImport]Btsdk_RegisterGetStatusInfoCB4ThirdParty: you need to remove it. (A delegate instance is of reference type, that's why.)

For delegate marshalling, see, for example: http://bytes.com/topic/c-sharp/answers/229011-hooks-delegates-callbacks[^].

Also, Google:

marshall callbacks and delegates "C#"


— a lot of quite relevant matter.

Please comment on your progress.

Thank you,
—SA
 
Share this answer
 
Comments
Pdaus 25-Jan-11 5:15am    
Thanks for ur guide SA... Now can hit the callback function..:-)
Sergey Alexandrovich Kryukov 25-Jan-11 13:48pm    
I'm happy it worked.
Good luck!
--SA
Espen Harlinn 6-Feb-11 14:40pm    
Good answer, as usual :)
Sergey Alexandrovich Kryukov 6-Feb-11 18:11pm    
Thank you. I reported only the first problem I spotted, was surprised it was enough for the OP fix.
--SA

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900