1

C++を使用する関数から現在実行中のすべてのプロセスIDの配列を返すことを検討しています。

私は次の関数でリストを列挙しています:

DWORD* xEnumProcs(){
    PROCESSENTRY32 pe32;
    HANDLE snapshot = NULL;
    DWORD pid[1024];
    DWORD* pointer;
    pointer = pid;
    int I = 0;

    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (snapshot != INVALID_HANDLE_VALUE) {
        pe32.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(snapshot, &pe32)) {
            do {
                pid[I] = pe32.th32ProcessID;
                I++;
            } while (Process32Next(snapshot, &pe32));
        }

        CloseHandle(snapshot);

    }

    return pointer;

}

これが適切に行われたかどうかはわかりません。私はこの配列を次のような別の関数内で利用しようとしています:

void HandleProcs(){
    DWORD* xNewProcs = xEnumProcs;
}

そして、これは私が最後の関数の本文の1行で受け取ったエラーです。

'initializing' : cannot convert from 'DWORD *(__cdecl *)(void)' to 'DWORD *'
1>          There is no context in which this conversion is possible
4

1 に答える 1

2

あなたはすでにあなたの答えを得ていると思いますが、学ぶために、ここでCバージョンを比較してください:

#include <stdio.h>  // printf
#include <Windows.h>
#include <Tlhelp32.h>

DWORD *EnumProcs(size_t *n)
{
    DWORD *pids = NULL;
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    *n = 0;
    if (snapshot != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 pe32 = { sizeof(pe32) };
        if (Process32First(snapshot, &pe32))
        {
            do { ++*n; } while (Process32Next(snapshot, &pe32));
            pids = calloc(*n, sizeof(pe32.th32ProcessID));
            *n = 0;
            Process32First(snapshot, &pe32);  // Maybe check return value
            do { pids[(*n)++] = pe32.th32ProcessID; }
            while (Process32Next(snapshot, &pe32));
        }
        CloseHandle(snapshot);
    }
    return pids;
}
int main()
{
    size_t i, n;
    DWORD *pids = EnumProcs(&n);
    for (i = 0; i < n; i++)
    { printf("%u\n", pids[i]); }
    free(pids);
}

C ++バージョンの場合:

#include <iostream>  // std::cout
#include <vector>  // std::vector, like List<T> in C# (or ArrayList<T> in Java)
#include <Windows.h>
#include <Tlhelp32.h>

std::vector<DWORD> EnumProcs()
{
    std::vector<DWORD> pids;
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (snapshot != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
        if (Process32First(snapshot, &pe32))
        {
            do
            {
                pids.push_back(pe32.th32ProcessID);
            } while (Process32Next(snapshot, &pe32));
        }
        CloseHandle(snapshot);
    }
    return pids;
}
int main()
{
    std::vector<DWORD> pids = EnumProcs();
    for (size_t i = 0; i < pids.size(); i++)
    { std::cout << pids[i] << std::endl; }
}

C ++のバージョンが完全に異なり、ポインターを使用していないことに注意してください。

もう一方の言語に移る前に、2つの言語の一方をよく学んでください。

于 2012-12-21T06:34:14.327 に答える