- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要有关使用 PCSAPI.dll 进行 IBM Emulator 编程的帮助。
C语言已经提供了文档,你可以引用这个网址:
PCSAPI Documentation IBM Emulator programming
有一个函数 pcsQuerySessionList 用于获取有关当前处于事件状态并连接到模拟器的 session 的信息。提供的函数是用C写的,但我需要用C#实现。
这是文档提供的功能:
ULONG PCSAPI_ENTRY pcsQuerySessionList(ULONG Count, SESSINFO *SessList);
typedef union _SESSNAME { // Name field of SessInfo structure
char ShortName; // Short session ID (A-Z)
ULONG Handle; // Session handle
} SESSNAME;
typedef struct _SESSINFO { // Description of a single session
SESSNAME Name; // Session name (ID or handle)
ULONG Status; // Session status (PCS_SESSION_* bit flags)
} SESSINFO;
这是关于 pcsQuerySessionList 的详细信息:
Function Type
ULONG WINAPI pcsQuerySessionList(ULONG Count, SESSINFO *SessionList)
Parameter Type and Description
ULONG Count
- Number of elements in the SessionList array
SESSINFO *SessionList
- Pointer to an array of SESSINFO structures as defined in PCSAPI.H
这是一个使用函数的例子:
ULONG NumSessions, i; // Session counters
SESSINFO *SessList; // Array of session information structures
// Find out number of sessions that exist
NumSessions = pcsQuerySessionList (0,NULL);
if (NumSessions == 0) {
printf("There are no sessions.");
exit;
}
// Allocate array large enough for all sessions
SessList = (SESSINFO *)malloc(NumSessions * sizeof(SESSINFO));
memset(SessList, 0x00, NumSessions * sizeof(SESSINFO));
// Now read actual session info
pcsQuerySessionList(NumSessions, SessList);
for (i=0; i<NumSessions; i++) {
if ((SessList[i].Status & PCS_SESSION_STARTED) &&
(SessList[i].Status & PCS_SESSION_ONLINE)) {
printf("Session %c is started and connected.",
SessList[i].Name.ShortName);
}
}
exit;
我已经尝试用 C# 实现它。你可以在下面的代码中看到它:
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
[DllImport("PCSAPI32.dll")]
public static extern int pcsQuerySessionList(out int sessionCount, out SESSINFO sessionInfo);
[StructLayout(LayoutKind.Sequential)]
public struct SESSNAME
{
char ShortName;
ulong Handle;
}
[StructLayout(LayoutKind.Sequential)]
public struct SESSINFO
{
[MarshalAs(UnmanagedType.Struct)]
SESSNAME Name;
ulong Status;
}
private void button3_Click(object sender, EventArgs e)
{
try
{
int sessCount = 0;
SESSINFO structSESSINFO;
sessCount = pcsQuerySessionList(out sessCount, out structSESSINFO);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
从上面的实现中,我成功获得了返回值(SESSINFO)。但是,当模拟器运行多个 session 时,我需要获取所有事件 session 信息,而我的代码只返回第一个事件 session 。当我尝试将 SESSINFO 解析为数组时,我遇到了访问冲突错误。
An unhandled exception of type 'System.AccessViolationException' occurred in PCSAPI.exe.
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
请帮我解决这个问题。任何帮助将不胜感激。
--编辑--
感谢您的建议。但是,我已经尝试了您的建议,但仍然出现同样的错误。
[DllImport("PCSAPI32.dll")]
public static extern int pcsQuerySessionList(out int sessionCount, ref SESSINFO[] sessionInfo);
private void button3_Click(object sender, EventArgs e)
{
try
{
int sessCount = 0;
SESSINFO[] structSESSINFO = new SESSINFO[sessCount];
sessCount = pcsQuerySessionList(out sessCount, ref structSESSINFO);
structSESSINFO = new SESSINFO[sessCount];
pcsQuerySessionList(out sessCount, ref structSESSINFO);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
此外,我已经获得了 sessCount 值(未使用数组),并且我也已经获得了 structSESSINFO 值但无法使用数组方法(多 session )获得 SESSINFO。它总是得到同样的错误。
--再次编辑--
这是代码:
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
[DllImport("PCSAPI32.dll")]
public static extern int pcsQuerySessionList(int sessionCount, SESSINFO[] sessionInfo);
[StructLayout(LayoutKind.Sequential)]
public struct SESSNAME
{
char ShortName;
ulong Handle;
}
[StructLayout(LayoutKind.Sequential)]
public struct SESSINFO
{
[MarshalAs(UnmanagedType.Struct)]
SESSNAME Name;
ulong Status;
}
private void button3_Click(object sender, EventArgs e)
{
try
{
int returnVal;
SESSINFO[] structSESSINFO = null;
returnVal = pcsQuerySessionList(0, structSESSINFO);
structSESSINFO = new SESSINFO[returnVal];
pcsQuerySessionList(returnVal, structSESSINFO);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
我已经尝试过 rs232 建议。上面的代码运行没有错误。我得到了 returnVal 但 structSESSINFO 是空的。
再次感谢您的帮助。
最佳答案
方法签名
ULONG PCSAPI_ENTRY pcsQuerySessionList(ULONG Count, SESSINFO *SessList);
和您提供的描述均表明该函数希望您为其提供已分配 SESSINFO 结构数组:SessList 参数应包含对该数组的引用,Count 参数指示数量该数组中的元素。您不能将函数的参数声明为“out”并期望它们由函数设置,您有责任分配一个数组并在该数组中传递正确数量的项目,只有这样函数才会将值填充到数组。
关于c# - C# 上的 PCSAPI IBM Emulator 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48222416/
如何将 Windows Phone Emulator only Emulator 7 升级到 Emulator 8 我正在使用 Visual Studio 2010 Windows Phone 7 S
我是 WebStorm 和 React Native 的新手,在设置我的环境时遇到了一个错误,与我看到的其他帖子相比,我的环境显得独特。 客观的 我在 WebStorm 中设置了一个默认项目,我的目标
Android 模拟器目前不支持多播,但是我需要测试需要多播数据包的应用程序。我想在模拟器上做。 有没有办法在 Android Emulator 上接收多播数据包?我愿意编写一些代码作为 androi
这个问题在这里已经有了答案: Full emulation vs. full virtualization (9 个回答) 6年前关闭。 我看到它们是不同的东西,但我真的不知道为什么。 有人说:“模拟
每次我运行模拟器时,它在开始时都能正常运行,但几分钟后它就会崩溃,并给我这个错误: emulator process finished with exit code 1073740791 (0xC00
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我刚刚安装了 VS2015 Preview,然后它让我可以选择安装其他软件,包括 Android Emulator。不幸的是,公司网络在下载完成之前出现故障,因此安装失败,并且没有给我重试的选项。 在
当我运行我的应用程序代码时,我可以在控制台中看到以下条目: [2011-03-01 10:29:26 - mireader] Uploading mireader.apk onto device 'e
我刚刚安装了 VS 2015 RC 并打开了适用于 Android 的 VS 模拟器。我无法从此模拟器连接到互联网。我去了设置 - > WiFi,可以看到它已打开,但未显示为已连接到任何网络。 关闭w
我正在使用 Android Studio 2.3(最新)。直到昨天一切都很好并且工作正常,今天模拟器没有连接到数据网络。 到目前为止,我找不到任何解决方案。我的 Mac 在 Mac OS Sierra
我正在使用 android SDK 4.0.3,我正在尝试运行一个简单的程序,在该程序中,我尝试使用 Intent 从一个页面切换到另一个页面(通过将 intent 对象传递为:Intent inte
问题是 我得到“HAX 不工作并且模拟器在模拟模式下运行”,这是否与 Intel x86 Emulator Accelerator (HAXM) 安装和运行 avd 且 CPU 设置为 CPU Int
我正在用 Go 编写云函数并从 firestore 模拟器触发它们。如果我手动启动 firestore 模拟器,这会起作用: java -jar ~/.cache/firebase/emulator
我的 Nexus One 有: 设置包括“语音 识别器设置”列表中 “语音输入和输出设置”。 Google 搜索有麦克风 它旁边的按钮,所以当我触摸 它,一个对话框提示我说什么 我要搜索。 然而,在模
我最近安装了 VS 2015 RC,Android 模拟器似乎运行良好(速度非常快 :)),只是它无法连接到网络。根据 http://blogs.msdn.com/b/visualstudioalm/
Android 模拟器在使用 Google Play 商店时显示消息“您的设备与此版本不兼容”。 它适用于真实设备(或至少适用于我测试过的设备)。 这些是我的 list 权限:
这个问题已经有答案了: Error in launching AVD with AMD processor (19 个回答) 已关闭 4 年前。 我在 exteras 中丢失了 Intel 文件夹,并
这更像是 android studio 中的一个良性错误。每当我从 sleep 或 hibernate 状态唤醒计算机时,模拟器和 android studio 之间的连接不正确,我必须重新启动模拟器
我正在尝试使用路由来测试应用程序。我正在使用 Android Studio 4.0.1 和模拟器版本 30.0.26。当我播放一条路线时,它看起来像是播放第一个位置,然后在 Lat Lon 更改为路线
Visual Studio Emulator for Android (VSEA) 运行良好,直到我开始使用视频卡来支持超宽显示器。运行几分钟后,我不断收到以下错误: An OpenGL error
我是一名优秀的程序员,十分优秀!