2013-08-16 2 views
0

Я пытаюсь вызвать неуправляемую функцию. Я назвал его из C++ с помощью: Это Test Project, который работает со мнойBYTE * Array in C#

// ConsoleApplication5.cpp : main project file. 

#include "stdafx.h" 
#include <windows.h> 
#include <stdio.h> 
#include <string> 

using namespace System; 

typedef int(*Funcs)(int, BYTE (*)[90], BYTE (*)[90]); 

int main(array<System::String ^> ^args) 
{ 
BYTE Input[] = 
     { 
        0x7f,0x06,0x02,0x66,0xd2,0x3e,0x4c,0x7f,0x50,0x0a,0x5a,0x3c,0xab,0x43,0x5d,0x51,0x47,0xe5,0 x94,0x49,0xbd,0xef,0xc2,0xe4 
,0x6c,0xb1,0x3b,0x3d,0x7c,0x47,0x65,0x8f,0x67,0xa6,0xe8,0x6a,0xe9,0x0e,0xbd,0x93,0xad,0x4a, 0x31,0x68,0x82,0x02,0xe6,0x7e,0x01,0x36,0xa, 
9,0x75,0xf7,0xa0,0xb9,0xe9,0x1b,0x09,0xba,0x19,0x8c,0x97,0x18,0x9c,0xcc,0xd8,0x87,0x0e,0x04 ,0xb3,0x7c,0xc2,0xbf,0x1e,0x42,0x3e,0x8b,0x64,0xf5,0x60,0x43,0x96,0xe7,0xf6,0x7d,0x54,0x84, 0x54,0x00 
     }; 
      BYTE OutPut[90]; 
Funcs Funcis; 
HMODULE x = LoadLibrary(L"E:\\Games\\Silkroad\\HackShield\\ehsvc.dll"); 
Funcis = (Funcs)GetProcAddress(x,"16"); 
Funcis(13,&Input,&OutPut); 

FILE * pFile; 
pFile = fopen ("myfile.bin", "wb"); 
fwrite (OutPut , sizeof(char), sizeof(OutPut), pFile); 
fclose (pFile); 

Console::Read(); 
} 

, но когда я называю это в C# по:

delegate int GetResponseD(int Code, byte[] Input, byte[] OutPut); 
... 
IntPtr hModule = LoadLibrary(@"###.dll"); 
IntPtr hFunc = GetProcAddress(hModule, "10"); 
GetResponseD Get = (GetResponseD)Marshal.GetDelegateForFunctionPointer(hFunc, typeof(GetResponseD)); 
GetResponse(13, Input, OutPut); 

я получаю первый байт только

+0

Вы пытались использовать соответствующие атрибуты «MarshaAs» для параметров делегата? – Corey

+0

Кто выделяет два массива в C? Вызывающий? – xanatos

+0

Не работает Извините – user2529018

ответ

0

Нечто подобное, если массивы выделяются методом в библиотеке DLL:

// You will probably have to free in some way Input and Output 
delegate int GetResponseD(int Code, ref IntPtr Input, ref IntPtr OutPut); 

static void Main() 
{ 
    IntPtr input = IntPtr.Zero, output = IntPtr.Zero; 
    GetResponseD grd = null; // something 

    int res = grd(1, out input, out output); 

    var input2 = new byte[90]; 
    var output2 = new byte[90]; 

    Marshal.Copy(input, input2, 0, input2.Length); 
    Marshal.Copy(output, output2, 0, output2.Length); 

    // Remember that you have to free input and output! 
} 

в C# вы не можете использовать неуправляемые массивы. Вы должны скопировать свои данные в управляемых массивах (не совсем верно, но истинные достаточно для того, что вам нужно)

Для другого режима вызова попытки:

delegate int GetResponseD(int Code, ref IntPtr Input, ref IntPtr OutPut); 

byte[] input = new byte[] { 
    0x7f,0x06,0x02,0x66,0xd2,0x3e,0x4c,0x7f,0x50,0x0a,0x5a,0x3c,0xab,0x43,0x5d,0x51,0x47,0xe5,0x94,0x49,0xbd,0xef,0xc2,0xe4,0x6c,0xb1,0x3b,0x3d,0x7c,0x47,0x65,0x8f,0x67,0xa6,0xe8,0x6a,0xe9,0x0e,0xbd,0x93,0xad,0x4a,0x31,0x68,0x82,0x02,0xe6,0x7e,0x01,0x36,0xa,9,0x75,0xf7,0xa0,0xb9,0xe9,0x1b,0x09,0xba,0x19,0x8c,0x97,0x18,0x9c,0xcc,0xd8,0x87,0x0e,0x04,0xb3,0x7c,0xc2,0xbf,0x1e,0x42,0x3e,0x8b,0x64,0xf5,0x60,0x43,0x96,0xe7,0xf6,0x7d,0x54,0x84,0x54,0x00 
}; 

byte[] output = new byte[90]; 

GetResponseD grd = null; // something 

GCHandle h1 = GCHandle.Alloc(input, GCHandleType.Pinned); 
GCHandle h2 = GCHandle.Alloc(output, GCHandleType.Pinned); 

IntPtr p1 = h1.AddrOfPinnedObject(); 
IntPtr p2 = h2.AddrOfPinnedObject(); 

grd(13, ref p1, ref p2); 

h1.Free(); 
h2.Free(); 

Проверьте вашу последовательность байт, я думаю, что есть ,0 x94 где-то и 9 без 0x в начале третьего ряда.

Из того, что я видел, этот метод имеет несколько способов вызова с первым параметром, который действует как «переключатель» и два других параметра, которые интерпретируются на основе первого параметра.

+0

введите код сработал, но после некоторых исправлений – user2529018

+0

sry он работает только тогда, когда параметр кода будет 1 – user2529018

+1

@ user2529018 Мы здесь не психические, опубликуем некоторый полный код использования C++. Кто выделяет память? Как осуществляется вход и выход? Кто освобождает память? – xanatos