解决方案 »

  1.   

    我用c#调用一个c编写的dll 返回一个指针 我在c#中该怎么通过这个指针去找对应的值
      

  2.   

    yourtype t = (yourtype)Marshal.PtrToStructure(ptr,typeof(yourtype))
      

  3.   

    谢谢 还有个问题
    C语言函数为int vip_fluoro_set_prms(int structType, void* structPtr)
    对应的c#函数 void*函数该怎么改?
      

  4.   

    你是说在C#里怎么引用吗?
    int vip_fluoro_set_prms(int structType, int structPtr)
    其中structPtr为获取Struct的IntPtr后传IntPtr.ToInt32()进去
      

  5.   

    你是说在C#里怎么引用吗?
    int vip_fluoro_set_prms(int structType, int structPtr)
    其中structPtr为获取Struct的IntPtr后传IntPtr.ToInt32()进去谢谢谢
      

  6.   

    《精通.NET互操作 P_Invoke,C++Interop和COM Interop》我最近找了这本书,有些心得,你有时间看看
      

  7.   

    [DllImport(path, EntryPoint = "OCR")]
    static extern IntPtr OCR...string result = Marshal.PtrToStringAnsi(OCR(xxx...))
      

  8.   

    这个示例代码有问题。
    int j生存在堆栈上,当方法返回,堆栈回滚后,指向j的指针就成了野指针。
      

  9.   

    这个示例代码有问题。
    int j生存在堆栈上,当方法返回,堆栈回滚后,指向j的指针就成了野指针。我将这段代码写成函数时,能确保ptr_dll_test->ptr_int这个值时正确的。这又是为什么?关于堆栈生存周期有什么资料可以推荐我看吗?
      

  10.   

    野指针有不确定性,比如下面的例子:// MyDll.cpp
    struct MyStruct
    {
        char Name[32];
        int* PtrM;
        int* PtrN;
    };int i = 88;
    extern "C" _declspec(dllexport) void Test(MyStruct* pMy)
    {
        int j = 99;
        pMy->PtrM = &i;
        pMy->PtrN = &j;  //<--有问题,指向堆栈中的数据
        strncpy(pMy->Name, "hello world", 32);
    }堆栈中的数据可能被方法调用覆盖:static void Main(string[] args)
    {
        MyStruct my = new MyStruct();
        Test(ref my);    int m1 = Marshal.ReadInt32(my.PtrM); // m1 = 88
        int n1 = Marshal.ReadInt32(my.PtrN); // n1 = -1 不是99    DoNothing();    int m2 = Marshal.ReadInt32(my.PtrM); // m2 = 88
        int n2 = Marshal.ReadInt32(my.PtrN); // n2 = 0  被DoNothing覆盖了。
    }static int DoNothing()
    {
        int i = 9;
        int j = i * 8;
        return i * j;
    }[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    struct MyStruct
    {
        [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 32)]
        public string Name;
        public IntPtr PtrM;
        public IntPtr PtrN;
    }[DllImport("MyDll", CallingConvention = CallingConvention.Cdecl)]
    static extern void Test(ref MyStruct myStruct);
      

  11.   

    解决了 定义时:WORD* buf= (WORD*)CoTaskMemAlloc(sizeof(WORD) * (512*512*2));
    最后在用完释放掉。