[英]BYTE * Array in C#
I'm trying to call unmanaged function. 我正在尝试调用非托管函数。 I've called it from C++ by : This is Test Project which working with me
我从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();
}
but when i call it in C# by: 但是当我通过以下方式在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);
i get the first Byte only 我只得到第一个字节
Something similar, if the arrays are allocated by the method in the dll: 类似的,如果数组是由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!
}
In C# you can't use unmanaged arrays. 在C#中,您不能使用非托管数组。 You have to copy their data in managed arrays (not entirely true, but true enough for what you need)
您必须将它们的数据复制到托管数组中(不完全正确,但足以满足您的需要)
For the other calling mode try: 对于其他呼叫方式,请尝试:
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();
Check your byte sequence, I think there is a ,0 x94
somewhere and 9
without 0x
at the beginning of the third row. 检查您的字节序列,我认为在第三行的开头有一个
,0 x94
地方,有9
没有0x
地方。
From what I've seen, this method has multiple ways of being called, with the first parameter that acts as a "switch" and the other two parameters that are interpreted based on the first parameter. 从我所看到的,此方法有多种调用方式,第一个参数充当“开关”,另外两个参数根据第一个参数进行解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.