怎么给mfc的ActiveX中传递内存数据???

时间:2021-04-03 08:59:54
mfc的方法是setBmpData(BYTE* bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)
在c#中调用的时候第一个参数BYTE* bmpData解释为ref byte类型,

怎么解决这个问题?

11 个解决方案

#1


将类型强制转换下 看看行不行!!

#2


需要手工修改

1. ildasm f:\TestLib.dll /out:f:\test.il 
2. 用Notepad打开test.il,修改这个函数的定义
3. ilasm f:\test.il /dll /output=f:\TestLib.dll 

#3


使用GCHandle和pin可以得到托管内存指针,然后传给非托管函数

#4


尝试类型转换,没成功
手工修改是不是不符合我的情况?我是生成的.ocx,没有dll和il文件
gw_net,能不能详细点?我没有基础,超级菜,怎么得到托管内存指针?怎么传给非托管函数?

谢谢了

#5


引用 4 楼 wyhvc 的回复:
尝试类型转换,没成功
手工修改是不是不符合我的情况?我是生成的.ocx,没有dll和il文件
gw_net,能不能详细点?我没有基础,超级菜,怎么得到托管内存指针?怎么传给非托管函数?

谢谢了


你要在C#中用的话,在引用这个ocx时,应该会自动生成一个Interop.XXXXLib.dll,这个自动生成的dll在生成接口的时候有问题,所以需要手工修改。

不过如果你可以修改MFC中这个接口函数
setBmpData(BYTE* bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)

可以修改为


setBmpData(SAFEARRAY(BYTE) bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)

或者

setBmpData(BYTE** bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)

这样的话C#就能够认识了

#6


谢谢liuyan4794,
我想修改MFC中的接口函数setBmpData
可是您说的BYTE** bmpData或者SAFEARRAY(BYTE),在调度映射那里怎么改?
按原来那样调度映射这里是
DISP_FUNCTION_ID(CtextureCtrl, "setBmpData", dispidsetBmpData, setBmpData, VT_BOOL,  VTS_PUI1 VTS_I4 VTS_I4 VTS_I4)
#define VTS_PUI1            "\x51"      // a 'BYTE*'
没有BYTE**的定义

#7


能不能把setBmpData(BYTE* bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)
改成
setBmpData(VARIANT bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)?

不过这样在c#里第一个参数是object,我还是不知道怎样把byte[]写成object型

#8


直接把byte[]数组传过去就可以了,它就是一个object

#9


试了无数次,这样成功了:
Activex:setBmpData(VARIANT &bmpData, SHORT bmpWidth, SHORT bmpHeight)
C#那里:
object data1=buf;//buf就是那个byte[]
然后把data1代入。

本来就不会,数据类型还耽误半天:mfc那边的Activex中用LONG,C#这边对应int,mfc那边用LONGLONG,C#这边对应long,mfc那边用__int64,c#这边用long,这三种对应方式带入对应参数都出错,没办法用的SHORT和int才算凑合过去,实在搞不懂怎么回事。

#10


呵呵,这种是挺烦的

#11


以下是数据类型对照
第一行为win32的类型
第二行为 C# Type

 
HANDLE/INT/LONG/BOOL
 int
 
UINT/ULONG/DWORD
 uint
 
BYTE
 byte
 
SHORT
 System.UInt16
 ushort
 
WORD
  short
 
BOOL
 int
 
CHAR
 sbyte
 
LPSTR/LPWSTR
 string in, System.Text.StringBuilder out
 
LPCSTR/LPCWSTR
 string
 
FLOAT
 float
 
DOUBLE
 double
 

#1


将类型强制转换下 看看行不行!!

#2


需要手工修改

1. ildasm f:\TestLib.dll /out:f:\test.il 
2. 用Notepad打开test.il,修改这个函数的定义
3. ilasm f:\test.il /dll /output=f:\TestLib.dll 

#3


使用GCHandle和pin可以得到托管内存指针,然后传给非托管函数

#4


尝试类型转换,没成功
手工修改是不是不符合我的情况?我是生成的.ocx,没有dll和il文件
gw_net,能不能详细点?我没有基础,超级菜,怎么得到托管内存指针?怎么传给非托管函数?

谢谢了

#5


引用 4 楼 wyhvc 的回复:
尝试类型转换,没成功
手工修改是不是不符合我的情况?我是生成的.ocx,没有dll和il文件
gw_net,能不能详细点?我没有基础,超级菜,怎么得到托管内存指针?怎么传给非托管函数?

谢谢了


你要在C#中用的话,在引用这个ocx时,应该会自动生成一个Interop.XXXXLib.dll,这个自动生成的dll在生成接口的时候有问题,所以需要手工修改。

不过如果你可以修改MFC中这个接口函数
setBmpData(BYTE* bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)

可以修改为


setBmpData(SAFEARRAY(BYTE) bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)

或者

setBmpData(BYTE** bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)

这样的话C#就能够认识了

#6


谢谢liuyan4794,
我想修改MFC中的接口函数setBmpData
可是您说的BYTE** bmpData或者SAFEARRAY(BYTE),在调度映射那里怎么改?
按原来那样调度映射这里是
DISP_FUNCTION_ID(CtextureCtrl, "setBmpData", dispidsetBmpData, setBmpData, VT_BOOL,  VTS_PUI1 VTS_I4 VTS_I4 VTS_I4)
#define VTS_PUI1            "\x51"      // a 'BYTE*'
没有BYTE**的定义

#7


能不能把setBmpData(BYTE* bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)
改成
setBmpData(VARIANT bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)?

不过这样在c#里第一个参数是object,我还是不知道怎样把byte[]写成object型

#8


直接把byte[]数组传过去就可以了,它就是一个object

#9


试了无数次,这样成功了:
Activex:setBmpData(VARIANT &bmpData, SHORT bmpWidth, SHORT bmpHeight)
C#那里:
object data1=buf;//buf就是那个byte[]
然后把data1代入。

本来就不会,数据类型还耽误半天:mfc那边的Activex中用LONG,C#这边对应int,mfc那边用LONGLONG,C#这边对应long,mfc那边用__int64,c#这边用long,这三种对应方式带入对应参数都出错,没办法用的SHORT和int才算凑合过去,实在搞不懂怎么回事。

#10


呵呵,这种是挺烦的

#11


以下是数据类型对照
第一行为win32的类型
第二行为 C# Type

 
HANDLE/INT/LONG/BOOL
 int
 
UINT/ULONG/DWORD
 uint
 
BYTE
 byte
 
SHORT
 System.UInt16
 ushort
 
WORD
  short
 
BOOL
 int
 
CHAR
 sbyte
 
LPSTR/LPWSTR
 string in, System.Text.StringBuilder out
 
LPCSTR/LPCWSTR
 string
 
FLOAT
 float
 
DOUBLE
 double