C++中的一个函数,
第一个参数是个结构体数组.
原C++程序在用的时候就是新建一个数组直接传进来,并不是传指针.我在C#中怎么用托管来表示呢?这个试半天了没搞定//C++函数如下
//VOID WINAPI PaintInView(
        //sPnt pntTypeArray[], 
        //int arrSize, 
        //CDC *pDC, 
        //int rcWidth, 
        //int rcHeight,
        //double central_x,
        //double central_y, 
        //int level=0,
        //enPTIVflag ptivflag=PTIV_R2PSMP); 

解决方案 »

  1.   

    CDC *pDC is one of the problems.You need to chang your c++ code.
      

  2.   


    C++ CODE 不是我写的,我是直接引用DLL的...用gethdc不行么
      

  3.   


    [DllImport("XXdll")
    private static extern //VOID WINAPI PaintInView( 
            //sPnt pntTypeArray[], 
            //int arrSize, 
            //CDC *pDC, 
            //int rcWidth, 
            //int rcHeight, 
            //double central_x, 
            //double central_y, 
            //int level=0, 
            //enPTIVflag ptivflag=PTIV_R2PSMP); 
      

  4.   

    楼主意思好像不是在C#里怎么使用C++的DLL吧?
    C#的方法不也是可以直接将数组作为参数?
      

  5.   


    HDC是一个句柄,而CDC是一个MFC类,他们的内存布局完全不一样。
    CDC的偏移量0应该是vtable指针,你传一个HDC(即GetHdc拿到的IntPtr)给C++,C++调用该CDC的任何虚函数的时候,都是不可预料的野指针调用。
    你可以自己做一下实验,看看i和j是否相同: CDC dc;
    int i = (int)&dc;
    int j = (int)&dc.m_hDC;
    能修改C++的话,使用HDC而不用CDC。
    不能修改C++的话,或许可以再写一个c++ Dll,你的C#程序调用该Dll并传入HDC,该Dll Attach HDC到一个CDC,然后再调用你不能修改的dll。
      

  6.   

    谢谢大家谢谢gomoku上午已经重新封装了部分DLL了C++不精通做的比较慢散分了