2015-11-13 7 views
5

Czy poniższy fragment można przekonwertować na C# .NET?Konwertowanie funkcji z C++ na C#

template <class cData> 
cData Read(DWORD dwAddress) 
{ 
    cData cRead; //Generic Variable To Store Data 
    ReadProcessMemory(hProcess, (LPVOID)dwAddress, &cRead, sizeof(cData), NULL); //Win API - Reads Data At Specified Location 
    return cRead; //Returns Value At Specified dwAddress 
} 

Jest to bardzo pomocne, gdy chcemy odczytać dane z pamięci w C++, bo to ogólna: można użyć Read<"int">(0x00)" lub Read<"vector">(0x00) i mieć to wszystko w jednej funkcji.

W C# .NET, to nie działa dla mnie, ponieważ do odczytu pamięci, potrzebujesz DLLImport ReadProcessMemory, który ma predefiniowane parametry, które oczywiście nie są ogólne.

+0

Być może można użyć strategia sugeruje tutaj: http://stackoverflow.com/a/6336196/3150802. Ale nie mam pewności, jak to spakować w zgrabną, jednorazową funkcję generyczną. Być może wymuś użycie klas do odczytu, aby zaimplementować jakiś typowy interfejs. –

+0

Dla typów wartości (structs, które zawierają tylko dane niezarządzane) prawdopodobnie możesz po prostu użyć adresu pamięci jako wskaźnika do struktury i zwrócić kopię tej instancji, całkowicie ogólnie, z ograniczeniem 'where T: struct' dla argumentu type. –

+0

W twojej nowej "nie" odpowiedzi "poniżej" powiedziałeś, że chcesz zwrócić wektor. Czy możesz wyjaśnić (oczywiście w tym oryginalnym poście)? Pytanie jest interesujące, ale nie rozumiem, dlaczego chciałbyś stworzyć wektor, jeśli istnieje int na podany adres. –

Odpowiedz

2

Czy coś takiego nie działa?

Działa to tylko w przypadku struktur, dlatego należy rozważyć łańcuchy rozrządowe, takie jak specjalny przypadek nietypowy, jeśli jest to potrzebne.

Prosty sprawdzić, czy to działa:

var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int))); 
var three = 3; 
Marshal.StructureToPtr(three, ptr, true); 
var data = Read<int>(ptr); 
Debug.Assert(data == three); //true 
Powiązane problemy