[英]BYTE * Array in C#
我正在嘗試調用非托管函數。 我從C ++調用它的方法是:這是與我一起工作的Test Project
// 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);
我只得到第一個字節
類似的,如果數組是由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
地方。
從我所看到的,此方法有多種調用方式,第一個參數充當“開關”,另外兩個參數根據第一個參數進行解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.