Member 13688663 Ответов: 1

Попытка использовать LPTSTR из C++ в C#


Система выдает исключение
System.NullReferenceException: 'Object reference not set to an instance of an object.'

Если кто-то знает решение, Пожалуйста, помогите

Что я уже пробовал:

Я пытаюсь использовать функцию c++, которая возвращает LPTStr в c#
Это мое dll.cpp файл
;extern "C" __declspec(dllexport) LPTSTR PID_GetProcessName(int a) {

	DWORD aProcesses[1024], cbNeeded, cProcesses;
	unsigned int i;
	EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded);
	if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
	{
		return NULL;
	}


	// Calculate how many process identifiers were returned.

	cProcesses = cbNeeded / sizeof(DWORD);
	TCHAR szProcessName[MAX_PATH];

	// Get a handle to the process.
	for (int i = 0; i <= cProcesses; i++)
		if (i == a) {
			HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
				PROCESS_VM_READ,
				FALSE, aProcesses[i]);

			// Get the process name.

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

				if (EnumProcessModules(hProcess, &hMod, sizeof(hMod),
					&cbNeeded))
				{
					GetModuleBaseName(hProcess, hMod, szProcessName,
						sizeof(szProcessName) / sizeof(TCHAR));
					LPTSTR b = szProcessName;
					return b;
				}
			}
			
			CloseHandle(hProcess);
			break;
		}
}

Это мой код на языке c#
[DllImport("D:\\RunningProcessDll\\Debug\\RunningProcessDll.dll",
             CallingConvention = CallingConvention.Cdecl)]
[return : MarshalAs(UnmanagedType.LPTStr)]
        public static extern string PID_GetProcessName(int a);

Richard Deeming

Вам действительно нужен этот код C++? То System.Diagnostics.Process класс[^] уже должен предоставить вам доступ к этой информации.

1 Ответов

Рейтинг:
2

KarstenK

Сообщение об ошибке показывает вам реальность: ваша функция возвращает при первом выходе NULL и ничего в конце.

1. Если вы возвращаете NULL, то вы должны проверить его в своем коде C# и обработать его.
2. в конце вашей функции вы также должны вернуть значение, возможно,"", чтобы отделить его от случая 1.


Member 13688663

Я думаю,вы не заметили, что я вернул BSTR bstrProcessName = SysAllocString(szProcessName);
возврат bstrProcessName;

Richard Deeming

И я думаю, что вы не заметили, что ваша функция возвращается NULL:

if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
{
    return NULL;
}
:)