gpt4 book ai didi

C++ - 数组指针作为函数参数,填充数组并从 UI 线程访问它

转载 作者:太空宇宙 更新时间:2023-11-04 12:22:08 25 4
gpt4 key购买 nike

自从 HS 之后,我就没有用 C++ 编写过太多代码,而且我很生疏/不是很有经验。

我想找到一台机器上所有正在运行的进程,并用它们的名称填充一个列表框控件。我创建了一个 C++ win 表单应用程序,在表单加载事件处理程序上我有以下代码 -

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
// Proccess monitor class
ProcessMonitor oMonitor;
// Array pointer
string* processes = NULL;
// Call method in process monitor class called get processes,
// pass int array pointer as parameter
oMonitor.GetProcesses(processes);
// Iterate through array
for (int i = 0; i < sizeof(processes) / sizeof(string); i++)
{

}
}
};

希望代码/注释足够直接。

这是我的 GetProcesses 方法的样子 -

void ProcessMonitor::GetProcesses(string processNames[])
{
// Array to hold process ID's
DWORD aProcesses[1024], cbNeeded, cProcesses;
// Iterator
unsigned int i;

// If no running processes can be detected exit function
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;

// Get number of running processes
cProcesses = cbNeeded / sizeof(DWORD);
// Instantiate array that was passed in
// ***NOTE*** I think this is where my problem lies,
// as I passed in a pointer to an array, not an actual array
processNames = new string[cProcesses];
// Iterate through array and initialize all indicies to an empty string
for ( int j = 0; j < sizeof(processNames) / sizeof(string); i++)
{
processNames[i] = "";
}

// Enumerate through processes and fill array with process names
for ( i = 0; i < cProcesses; i++ )
{
if( aProcesses[i] != 0 )
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);

if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

/*Given a handle to a process, this returns all the modules running within the process.
The first module is the executable running the process,
and subsequent handles describe DLLs loaded into the process.*/
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
//This function returns the short name for a module,
//typically the file name portion of the EXE or DLL
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
processNames[i] = szProcessName;
}
}
CloseHandle( hProcess );
}
}
}

我认为我的代码存在的问题是我没有实例化我的数组,直到它已经在 GetProcesses 方法中。当代码返回调用窗口窗体时,指向我传入的数组的指针为空。我猜我必须做的是在将数组作为参数传递给函数之前实例化数组。问题是在确定机器上正在运行的进程数之前,我不知道数组需要的大小。

我意识到我可以将 GetProcesses 函数分解为两个调用,一个用于确定数组所需的大小,一个用于填充数组。问题是如果你检查条件 -

if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;

该条件下的调用会用所有进程 ID 填充 aProcesses 数组。我不想这样做两次。

有人知道我做错了什么吗?

再次道歉,如果我真的离开这里,我很抱歉,我已经有一段时间没有用 C++ 编写任何程序了。

最佳答案

ProcessMonitor::GetProcesses(字符串 processNames[])

我认为你需要传递一个指针给函数

不太确定语法

ProcessMonitor::GetProcesses(字符串 *processNames[])

因为processNames = new string[cProcesses];将在本地分配它并且不会返回...

(哦,是的,我认为托管 C++ 是世界上最糟糕的。但这是我的看法。)

关于C++ - 数组指针作为函数参数,填充数组并从 UI 线程访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4410876/

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