2

I am working on simple telephony application where I am changing the class of service of panasonic pbx extension. For that I am using "Tapi32.dll" which has methods in c++. Now as per my need I have to pass two argument both integer pointer type. One Argument is getting passed correctly but I am not able to pass second argumnet which is structure type.

Here is my code...

[DllImport("Tapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
unsafe private static extern int lineDevSpecific(int* hLine, int* lpParams);

[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
    [MarshalAs(UnmanagedType.I4)]
    public int dwMode=4;
    public int dwParam1=8;
}

unsafe static void Main(string[] args) {
    int vline=int.Parse("Ext101");
    int* hline = &vline;
    lineDevSpecific(hline, ref UserRec userrec);
}
1

1 Answer 1

2
[DllImport("Tapi32.dll", SetLastError=true)]
unsafe private static extern int lineDevSpecific(int* hLine, IntPtr lpParams);

unsafe static void Main(string[] args) {
    int vline=int.Parse("Ext101");
    int* hline=&vline;

    var sizeUserRec=Marshal.SizeOf(typeof(UserRec));
    var userRec=Marshal.AllocHGlobal(sizeUserRec);
    lineDevSpecific(hline, userRec);
    var x=(UserRec)Marshal.PtrToStructure(userRec, typeof(UserRec));
    Marshal.FreeHGlobal(userRec);
}

Take a look of this answer of question

You can find some more to make marshalling easier and more reusable.

Sign up to request clarification or add additional context in comments.

2 Comments

ken Sir I am getting error "cannot have instance field initializers in structs c#"
@vikas: You cannot have the field initializers that way. Just remove the default values of dwMode and dwParam1.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.