Win API 方法调用在 MS VS2008 内置的应用程序中工作,但在 VS2012 中不工作
Win API method call working in app built in MS VS2008, but not in VS2012
我有 Win7 64 位。在我的项目中,我使用来自 user32.dll 的 Win API 函数进行 DDE 通信。在 MS VS2008 中,一切正常,但现在我正在尝试将项目升级到 MS VS2012(在同一台 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 已在此行触发断点 ”。
你能建议任何让它起作用的方法吗?
您不能直接使用 DdeAccessData 的 return 值,因为编组器无法知道正在 returned 的数据的大小。
我没有对此进行测试,但您可以尝试使用 IntPtr 作为 return 值:
[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);
我有 Win7 64 位。在我的项目中,我使用来自 user32.dll 的 Win API 函数进行 DDE 通信。在 MS VS2008 中,一切正常,但现在我正在尝试将项目升级到 MS VS2012(在同一台 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 已在此行触发断点 ”。
你能建议任何让它起作用的方法吗?
您不能直接使用 DdeAccessData 的 return 值,因为编组器无法知道正在 returned 的数据的大小。
我没有对此进行测试,但您可以尝试使用 IntPtr 作为 return 值:
[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);