在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
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,能不能详细点?我没有基础,超级菜,怎么得到托管内存指针?怎么传给非托管函数?
谢谢了
手工修改是不是不符合我的情况?我是生成的.ocx,没有dll和il文件
gw_net,能不能详细点?我没有基础,超级菜,怎么得到托管内存指针?怎么传给非托管函数?
谢谢了
#5
你要在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**的定义
我想修改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型
改成
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才算凑合过去,实在搞不懂怎么回事。
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
第一行为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
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,能不能详细点?我没有基础,超级菜,怎么得到托管内存指针?怎么传给非托管函数?
谢谢了
手工修改是不是不符合我的情况?我是生成的.ocx,没有dll和il文件
gw_net,能不能详细点?我没有基础,超级菜,怎么得到托管内存指针?怎么传给非托管函数?
谢谢了
#5
你要在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**的定义
我想修改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型
改成
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才算凑合过去,实在搞不懂怎么回事。
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
第一行为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