mfc的方法是setBmpData(BYTE* bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)
在c#中调用的时候第一个参数BYTE* bmpData解释为ref byte类型,怎么解决这个问题?

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   


    你要在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#就能够认识了
      

  5.   

    谢谢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**的定义
      

  6.   

    能不能把setBmpData(BYTE* bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)
    改成
    setBmpData(VARIANT bmpData, LONG dataSize, LONG bmpWidth, LONG bmpHeight)?不过这样在c#里第一个参数是object,我还是不知道怎样把byte[]写成object型
      

  7.   

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

  8.   

    试了无数次,这样成功了:
    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才算凑合过去,实在搞不懂怎么回事。
      

  9.   

    以下是数据类型对照
    第一行为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