【问题标题】:How to pass structure as pointer in C dll from C#如何从 C# 将结构作为指针传递给 C dll
【发布时间】:2013-03-04 08:14:20
【问题描述】:

我正在开发简单的电话应用程序,我正在更改松下 pbx 分机的服务等级。为此,我正在使用具有 c++ 方法的“Tapi32.dll”。现在根据我的需要,我必须传递两个整数指针类型的参数。一个参数被正确传递,但我无法传递第二个结构类型的 argumnet。

这是我的代码...

[DllImport("Tapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
unsafe private static extern int lineDevSpecific(int* hLine, int* lpParams);

[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
    [MarshalAs(UnmanagedType.I4)]
    public int dwMode=4;
    public int dwParam1=8;
}

unsafe static void Main(string[] args) {
    int vline=int.Parse("Ext101");
    int* hline = &vline;
    lineDevSpecific(hline, ref UserRec userrec);
}

【问题讨论】:

标签: c# c++


【解决方案1】:
[DllImport("Tapi32.dll", SetLastError=true)]
unsafe private static extern int lineDevSpecific(int* hLine, IntPtr lpParams);

unsafe static void Main(string[] args) {
    int vline=int.Parse("Ext101");
    int* hline=&vline;

    var sizeUserRec=Marshal.SizeOf(typeof(UserRec));
    var userRec=Marshal.AllocHGlobal(sizeUserRec);
    lineDevSpecific(hline, userRec);
    var x=(UserRec)Marshal.PtrToStructure(userRec, typeof(UserRec));
    Marshal.FreeHGlobal(userRec);
}

看看这个问题的答案

您可以找到更多内容来使编组更容易和更可重用。

【讨论】:

  • ken 先生,我收到错误“在 c# 结构中不能有实例字段初始值设定项”
  • @vikas:你不能这样使用字段初始化器。只需删除dwModedwParam1 的默认值即可。
猜你喜欢
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多