你要在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#就能够认识了
能不能把setBmpData(BYTE* bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight) 改成 setBmpData(VARIANT bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)?不过这样在c#里第一个参数是object,我还是不知道怎样把byte[]写成object型
直接把byte[]数组传过去就可以了,它就是一个object
试了无数次,这样成功了: 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才算凑合过去,实在搞不懂怎么回事。
以下是数据类型对照 第一行为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
2. 用Notepad打开test.il,修改这个函数的定义
3. ilasm f:\test.il /dll /output=f:\TestLib.dll
手工修改是不是不符合我的情况?我是生成的.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#就能够认识了
我想修改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**的定义
改成
setBmpData(VARIANT bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)?不过这样在c#里第一个参数是object,我还是不知道怎样把byte[]写成object型
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才算凑合过去,实在搞不懂怎么回事。
第一行为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