C-Dll in VB.net
-
Hallo,
ich hab ein ziemlich spezielles Problem. Da ich einige Speicher-Informationen auslesen möchte und dies aber mit VB.NET nicht so problemlos möglich ist, habe ich versucht, mein funktionierendes C++-Konsolenprogramm in eine DLL umzuwandeln.
Auf diese wollte ich dann mit VB.NET zugreifen, aber irgendwie will das nicht funktiuonieren.
Vielleicht könnt ihr euch mal den Code anschauen und mir sagen, wo der Fehler liegt?
MemoryDLL.cpp
#include "stdafx.h" //#include <windows.h> #include <stdio.h> #include <iostream> #include <cmath> #include <stdlib.h> HWND hwnd; HANDLE handle; DWORD ID; extern "C" __declspec(dllexport)void GetName(DWORD PLAYERBASE_PTR, DWORD PLAYERBASE_OFFSET, char& CharName); void GetName(DWORD PLAYERBASE_PTR, DWORD PLAYERBASE_OFFSET, char& CharName) { using namespace std; hwnd = FindWindow(NULL, (LPCWSTR)"Minesweeper"); // Prozess-ID besorgen GetWindowThreadProcessId(hwnd, &ID); // Prozess öffnen mit allen Rechten //handle = OpenProcess(PROCESS_ALL_ACCESS, false, ID); handle = OpenProcess(PROCESS_VM_READ, false, ID); // Struct erstellen char cname[17]; DWORD baseptr; DWORD pptr; // Adresse auslesen ReadProcessMemory(handle, (void*)PLAYERBASE_PTR, &baseptr, sizeof(baseptr), NULL); // Player Addy auslesen ReadProcessMemory(handle, (void*)(baseptr+PLAYERBASE_OFFSET), &pptr, sizeof(pptr), NULL); // Name auslesen ReadProcessMemory(handle, (void*)(pptr+0x0278), &cname, sizeof(cname), NULL); }
dllmain.cpp
#include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
Der Wert, welcher in cname steht, soll dann in VB:NET weiter verarbeitet werden.
Dazu habe ich filgendes Programm probiert, aber es geht eben nicht.
Imports System.Runtime.InteropServices Public Class Form1 Declare Auto Function GetName Lib "D:\Dokumente und Einstellungen\Enrico.SkyNet\Desktop\bot\DLL\MemoryDLL\Release\MemoryDLL.dll" ( _ ByVal PLAYERBBASE_PTR As String, _ ByVal PLAYERBASE_OFFSET As String, _ ByRef CharName As String) _ As String Dim PB_PTR As String = "0x0088EF20" Dim PB_OFFSET As String = "0x0580" Dim CN As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Label1.Text = "Start" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click GetName(PB_PTR, PB_OFFSET, CN) Label1.Text = PB_PTR Label2.Text = PB_OFFSET Label3.Text = CN End Sub End Class
Irgendwie bekomme ich bei CN keinen Wert zurück.
MfG
Memphis
-
Ein hoffnungsloser Fall...
Versuch das erst mal in einem Console-Programm hinzubekommen, dann kannst Du ja eine DLL daraus machen... und dann kann man Dir auch sagen wie die Funktionssignatur richtig sein sollte...
-
Das, was ich oben in der MemoryDLL.cpp hab, habe ich aus meinem Konsolenprogramm, welches auch funktionierte.
Der Wert, welcher dort im Speicher stand, wurde mir in der Konsole ausgegeben!
-
Mit Sicherheit nicht... schon allein der cast nach LPWSTR zeugt davon...
PS: Wie soll den in CharName irgendwas zurückkommen, wenn Du es gar nicht verwendest?
-
Ein hoffnungsloser Fall...
...