C++ DLL und VB.NET 2008



  • 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



  • Hat hier niemand eine Antwort für mich?



  • Da bist du im völlig falschen Forum. C++/CLI wäre passender. Oder vielleicht C# und .Net als Anlaufpunkt für alle allgemeinen .Net-Fragen.
    Hier geht es um Standard-C++, was was anderes ist als du willst.


Anmelden zum Antworten