代码之家  ›  专栏  ›  技术社区  ›  Majak

Win API方法调用在MS VS2008中内置的应用程序中工作,但在VS2012中不工作

  •  1
  • Majak  · 技术社区  · 9 年前

    我有Win7 64位。在我的项目中,我使用Win API函数 用户32.dll 用于DDE通信。在MSVS2008中,一切都没有问题,但现在我正在尝试将项目升级到MSVS2012(在同一台PC和OS上),API函数调用导致程序崩溃。

    具体来说,该功能是:

    [DllImport("user32.dll", EntryPoint = "DdeAccessData", CharSet = CharSet.Ansi)]
        internal static extern string DdeAccessDataString(IntPtr p, out int datasize);
    

    这就是所谓的:

    string result = Dde.DdeAccessDataString(da, out datasize);
    

    我正在尝试以某种方式调试它,但没有成功。我只能得到信息,“ Windows已触发断点 “在这行。

    你能提出什么方法让它发挥作用吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   yms    9 年前

    不能使用的返回值 DdeAccessData 直接,因为编组器无法知道返回的数据的大小。

    我还没有测试过,但您可以尝试使用IntPtr作为返回值:

    [DllImport("user32.dll", EntryPoint = "DdeAccessData")]
        internal static extern IntPtr DdeAccessData(IntPtr p, out int datasize);
    

    然后使用 Marshal.ReadByte 以检索数据。

    IntPtr ptrByteArray = Dde.DdeAccessDataString(da, out datasize);
    byte[] data = new byte[datasize];
    for(int i =0; i < datasize; i++)
    {
        data[i] = Marshal.ReadByte(ptrByteArray, i);
    }
    string result = System.Text.Encoding.ASCII.GetString(data);
    

    你需要打电话 DdeUnaccessData 一旦你完成了。

    Dde.DdeUnaccessData(da);