gpt4 book ai didi

c# - C# 上的 PCSAPI IBM Emulator 编程

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:26 24 4
gpt4 key购买 nike

我需要有关使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com