471,310 Members | 1,486 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,310 software developers and data experts.

OCX(COM) Interop...Passing pointer of structure to function

Hi,

I have the following question regarding communicating with a OCX control
using C#. Idon't have access to the ocx code, so my c# code is actually mimic
the behavior of C++ counterparts. Basically, I have problem passing a
structure to a function.

Here is the C++ part code:

//****************************************
typedef struct
{
char TypeID;
char UserName[20];
char Password[20];
char UrlAddress[255];
int iStreamChannel;
bool bDirectDrawMode;
}CONNECT_DATA;

CONNECT_DATA m_ConnectData;

// after initializing m_ConnectData

int ret= InitConnectData((PBYTE)&m_ConnectData);

//****************************************

In C# when I drop this active control to my app, the interface for the
function
InitConnectData has be given as follows

InitConnectData(ref byte)

So the following is what I did in the C# part.

//****************************************

[StructLayout(LayoutKind.Sequential,CharSet=CharSet .Ansi,Pack=8)]
public unsafe struct CONNECT_DATA
{
public byte TypeID;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string UserName;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Password;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
public string UrlAddress;

public int iStreamChannel;
public bool bDirectDrawMode;

}

CONNECT_DATA connect_data = new CONNECT_DATA();

// After initializing all the fields

IntPtr pnt = Marshal.AllocCoTaskMem(Marshal.SizeOf(connect_data ));
try
{
Marshal.StructureToPtr(connect_data, pnt, false);
byte[] buffer = new byte[Marshal.SizeOf(connect_data)];
Marshal.Copy(pnt, buffer, 0, Marshal.SizeOf(connect_data));
int ret = axNetworkCameraLink2.InitConnectData(ref buffer[0]);
}
//****************************************

But it seems that the function never gets the structure right, for it always
gives the wrong return value.

I tried to "Tlbimp" the original DLL, change the IL code so that the
"InitConnectData(uint8&)" becames "InitConnectData(native int)", and in C#
the interface becames "InitConnectData(System.IntPtr)", but error occurs,
stating that

"System.Runtime.InteropServices.COMException
(0x80020005): Type mismatch. at
System.RuntimeType.ForwardCallToInvokeMember(Strin g memberName, BindingFlags
flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)"

I guess it is because uint8 is 8 bit and native int is 32 bit...I really
don't know
what to do now, and I think I must do something wrong...Please help, thanks!

Sep 25 '08 #1
3 2598
Dont know about the actual call but I can see a few problems with your
structure definition :

1. The UserName,password and address are defined as ByValTStr (means Ansi or
Uni depending on platform) when in fact they are defined as ANSI in the
original structure.

2. The bDirectDrawMode is defined as bool (which marshals to 4 bytes) but
the origianl structure defines it as smallcase bool which in C++ I think
occupies 1 byte.

---------
- G Himangi, LogicNP Software http://www.ssware.com
Shell MegaPack: GUI Controls For Drop-In Windows Explorer like File/Folder
Browsing Functionality (.Net & ActiveX Editions).
EZNamespaceExtensions: Develop namespace extensions rapidly in .Net and
MFC/ATL/C++
EZShellExtensions: Develop all shell extensions,explorer bars and BHOs
rapidly in .Net & MFC/ATL/C++
---------

"Mingyi" <Mi****@discussions.microsoft.comwrote in message
news:4C**********************************@microsof t.com...
Hi,

I have the following question regarding communicating with a OCX control
using C#. Idon't have access to the ocx code, so my c# code is actually
mimic
the behavior of C++ counterparts. Basically, I have problem passing a
structure to a function.

Here is the C++ part code:

//****************************************
typedef struct
{
char TypeID;
char UserName[20];
char Password[20];
char UrlAddress[255];
int iStreamChannel;
bool bDirectDrawMode;
}CONNECT_DATA;

CONNECT_DATA m_ConnectData;

// after initializing m_ConnectData

int ret= InitConnectData((PBYTE)&m_ConnectData);

//****************************************

In C# when I drop this active control to my app, the interface for the
function
InitConnectData has be given as follows

InitConnectData(ref byte)

So the following is what I did in the C# part.

//****************************************

[StructLayout(LayoutKind.Sequential,CharSet=CharSet .Ansi,Pack=8)]
public unsafe struct CONNECT_DATA
{
public byte TypeID;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string UserName;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Password;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
public string UrlAddress;

public int iStreamChannel;
public bool bDirectDrawMode;

}

CONNECT_DATA connect_data = new CONNECT_DATA();

// After initializing all the fields

IntPtr pnt = Marshal.AllocCoTaskMem(Marshal.SizeOf(connect_data ));
try
{
Marshal.StructureToPtr(connect_data, pnt, false);
byte[] buffer = new byte[Marshal.SizeOf(connect_data)];
Marshal.Copy(pnt, buffer, 0, Marshal.SizeOf(connect_data));
int ret = axNetworkCameraLink2.InitConnectData(ref
buffer[0]);
}
//****************************************

But it seems that the function never gets the structure right, for it
always
gives the wrong return value.

I tried to "Tlbimp" the original DLL, change the IL code so that the
"InitConnectData(uint8&)" becames "InitConnectData(native int)", and in C#
the interface becames "InitConnectData(System.IntPtr)", but error occurs,
stating that

"System.Runtime.InteropServices.COMException
(0x80020005): Type mismatch. at
System.RuntimeType.ForwardCallToInvokeMember(Strin g memberName,
BindingFlags
flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)"

I guess it is because uint8 is 8 bit and native int is 32 bit...I really
don't know
what to do now, and I think I must do something wrong...Please help,
thanks!

Sep 25 '08 #2

Hi,

I think the first problem is solved by the declaration
"CharSet=CharSet.Ansi" (I think..)

For the second one, I used to marshall the bool to 1 byte counterpart, but
the problem persists..

Thanks for the reply anyway.
"G Himangi" wrote:
Dont know about the actual call but I can see a few problems with your
structure definition :

1. The UserName,password and address are defined as ByValTStr (means Ansi or
Uni depending on platform) when in fact they are defined as ANSI in the
original structure.

2. The bDirectDrawMode is defined as bool (which marshals to 4 bytes) but
the origianl structure defines it as smallcase bool which in C++ I think
occupies 1 byte.

---------
- G Himangi, LogicNP Software http://www.ssware.com
Shell MegaPack: GUI Controls For Drop-In Windows Explorer like File/Folder
Browsing Functionality (.Net & ActiveX Editions).
EZNamespaceExtensions: Develop namespace extensions rapidly in .Net and
MFC/ATL/C++
EZShellExtensions: Develop all shell extensions,explorer bars and BHOs
rapidly in .Net & MFC/ATL/C++
---------

"Mingyi" <Mi****@discussions.microsoft.comwrote in message
news:4C**********************************@microsof t.com...
Hi,

I have the following question regarding communicating with a OCX control
using C#. Idon't have access to the ocx code, so my c# code is actually
mimic
the behavior of C++ counterparts. Basically, I have problem passing a
structure to a function.

Here is the C++ part code:

//****************************************
typedef struct
{
char TypeID;
char UserName[20];
char Password[20];
char UrlAddress[255];
int iStreamChannel;
bool bDirectDrawMode;
}CONNECT_DATA;

CONNECT_DATA m_ConnectData;

// after initializing m_ConnectData

int ret= InitConnectData((PBYTE)&m_ConnectData);

//****************************************

In C# when I drop this active control to my app, the interface for the
function
InitConnectData has be given as follows

InitConnectData(ref byte)

So the following is what I did in the C# part.

//****************************************

[StructLayout(LayoutKind.Sequential,CharSet=CharSet .Ansi,Pack=8)]
public unsafe struct CONNECT_DATA
{
public byte TypeID;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string UserName;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Password;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
public string UrlAddress;

public int iStreamChannel;
public bool bDirectDrawMode;

}

CONNECT_DATA connect_data = new CONNECT_DATA();

// After initializing all the fields

IntPtr pnt = Marshal.AllocCoTaskMem(Marshal.SizeOf(connect_data ));
try
{
Marshal.StructureToPtr(connect_data, pnt, false);
byte[] buffer = new byte[Marshal.SizeOf(connect_data)];
Marshal.Copy(pnt, buffer, 0, Marshal.SizeOf(connect_data));
int ret = axNetworkCameraLink2.InitConnectData(ref
buffer[0]);
}
//****************************************

But it seems that the function never gets the structure right, for it
always
gives the wrong return value.

I tried to "Tlbimp" the original DLL, change the IL code so that the
"InitConnectData(uint8&)" becames "InitConnectData(native int)", and in C#
the interface becames "InitConnectData(System.IntPtr)", but error occurs,
stating that

"System.Runtime.InteropServices.COMException
(0x80020005): Type mismatch. at
System.RuntimeType.ForwardCallToInvokeMember(Strin g memberName,
BindingFlags
flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)"

I guess it is because uint8 is 8 bit and native int is 32 bit...I really
don't know
what to do now, and I think I must do something wrong...Please help,
thanks!


Sep 25 '08 #3
>
I think the first problem is solved by the declaration
"CharSet=CharSet.Ansi" (I think..)
Yes, you are right.

Another problem I noticed was the Pack=8 attribute. Is this type of packing
specified on the original structure? If not, leave it out.

---------
- G Himangi, LogicNP Software http://www.ssware.com
Shell MegaPack: GUI Controls For Drop-In Windows Explorer like File/Folder
Browsing Functionality (.Net & ActiveX Editions).
EZNamespaceExtensions: Develop namespace extensions rapidly in .Net and
MFC/ATL/C++
EZShellExtensions: Develop all shell extensions,explorer bars and BHOs
rapidly in .Net & MFC/ATL/C++
---------

"Mingyi" <Mi****@discussions.microsoft.comwrote in message
news:B7**********************************@microsof t.com...
>
Hi,

I think the first problem is solved by the declaration
"CharSet=CharSet.Ansi" (I think..)

For the second one, I used to marshall the bool to 1 byte counterpart, but
the problem persists..

Thanks for the reply anyway.
"G Himangi" wrote:
>Dont know about the actual call but I can see a few problems with your
structure definition :

1. The UserName,password and address are defined as ByValTStr (means Ansi
or
Uni depending on platform) when in fact they are defined as ANSI in the
original structure.

2. The bDirectDrawMode is defined as bool (which marshals to 4 bytes) but
the origianl structure defines it as smallcase bool which in C++ I think
occupies 1 byte.

---------
- G Himangi, LogicNP Software http://www.ssware.com
Shell MegaPack: GUI Controls For Drop-In Windows Explorer like
File/Folder
Browsing Functionality (.Net & ActiveX Editions).
EZNamespaceExtensions: Develop namespace extensions rapidly in .Net and
MFC/ATL/C++
EZShellExtensions: Develop all shell extensions,explorer bars and BHOs
rapidly in .Net & MFC/ATL/C++
---------

"Mingyi" <Mi****@discussions.microsoft.comwrote in message
news:4C**********************************@microso ft.com...
Hi,

I have the following question regarding communicating with a OCX
control
using C#. Idon't have access to the ocx code, so my c# code is actually
mimic
the behavior of C++ counterparts. Basically, I have problem passing a
structure to a function.

Here is the C++ part code:

//****************************************
typedef struct
{
char TypeID;
char UserName[20];
char Password[20];
char UrlAddress[255];
int iStreamChannel;
bool bDirectDrawMode;
}CONNECT_DATA;

CONNECT_DATA m_ConnectData;

// after initializing m_ConnectData

int ret= InitConnectData((PBYTE)&m_ConnectData);

//****************************************

In C# when I drop this active control to my app, the interface for the
function
InitConnectData has be given as follows

InitConnectData(ref byte)

So the following is what I did in the C# part.

//****************************************

[StructLayout(LayoutKind.Sequential,CharSet=CharSet .Ansi,Pack=8)]
public unsafe struct CONNECT_DATA
{
public byte TypeID;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string UserName;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Password;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
public string UrlAddress;

public int iStreamChannel;
public bool bDirectDrawMode;

}

CONNECT_DATA connect_data = new CONNECT_DATA();

// After initializing all the fields

IntPtr pnt =
Marshal.AllocCoTaskMem(Marshal.SizeOf(connect_data ));
try
{
Marshal.StructureToPtr(connect_data, pnt, false);
byte[] buffer = new byte[Marshal.SizeOf(connect_data)];
Marshal.Copy(pnt, buffer, 0,
Marshal.SizeOf(connect_data));
int ret = axNetworkCameraLink2.InitConnectData(ref
buffer[0]);
}
//****************************************

But it seems that the function never gets the structure right, for it
always
gives the wrong return value.

I tried to "Tlbimp" the original DLL, change the IL code so that the
"InitConnectData(uint8&)" becames "InitConnectData(native int)", and in
C#
the interface becames "InitConnectData(System.IntPtr)", but error
occurs,
stating that

"System.Runtime.InteropServices.COMException
(0x80020005): Type mismatch. at
System.RuntimeType.ForwardCallToInvokeMember(Strin g memberName,
BindingFlags
flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)"

I guess it is because uint8 is 8 bit and native int is 32 bit...I
really
don't know
what to do now, and I think I must do something wrong...Please help,
thanks!



Sep 26 '08 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

19 posts views Thread by Steve | last post: by
4 posts views Thread by javaid iqbal | last post: by
15 posts views Thread by Carlos Lozano | last post: by
1 post views Thread by marfi95 | last post: by
1 post views Thread by omar.torres | last post: by
3 posts views Thread by =?Utf-8?B?amFtZXNAbm9zcGFtLmNvbQ==?= | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.