Sea*_*ver 6 c# pinvoke interop unmanaged marshalling
我在我的C#程序中声明了一个DLL导入,如下所示:
[DllImport("C:\\c_keycode.dll", EntryPoint = "generateKeyCode",
CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr generateKeyCode(char[] serial, char[] option, char c_type);
Run Code Online (Sandbox Code Playgroud)
它引用了generateKeyCode()我的DLL内部的函数.
以下是导致错误的代码(使用的断点):
const char* generateKeyCode(char serial[],
char option[],
char c_type)
{
returnBufferString = "";
SHA1_CTX context;
int optionLength = 0;
#ifdef WIN32
unsigned char buffer[16384] = {0};
#else
unsigned char buffer[256] = {0};
#endif
//char output[80];
char keycode[OPTION_KEY_LENGTH+1] = "";
int digest_array_size = 10; //default value for digest array size
unsigned char digest[20] = {0};
char optx[24] = {0};
char c_type_upper;
// Combine serial # and Option or Version number
char str1[30] = {0};
int i;
int size = 0;
int pos = 0;
...
...
}
Run Code Online (Sandbox Code Playgroud)
基本上,我导入了这个DLL,所以我可以传递函数参数,它可以做它的算法,只需返回一个结果.我使用了这个封送功能......
public static string genKeyCode_marshal(string serial, string option, char type)
{
return Marshal.PtrToStringAnsi(generateKeyCode(serial.ToCharArray(),
option.ToCharArray(), type));
}
Run Code Online (Sandbox Code Playgroud)
...所以我可以正确地打电话.在我的C++头文件中,我已经定义了一个字符串,正如所指出的那样有助于回答这个问题(它是returnBufferStringC/C++函数顶部的变量).
我使用一个NumericUpDown控件从1.0到9.9以0.1的增量(每个向上或向下伴随另一个函数调用)进行多次调用,然后再次向下调用.但是,每次我尝试这样做时,程序会在看似设定数量的函数调用之后挂断(如果我直接上下移动,则在返回的路上停止在1.9,如果我上下移动一下,则停止更早) .
请注意,它有效,并给我我想要的价值,那里没有差异.
我将缓冲区大小更改为更小的数字(5012),当我尝试运行程序时,在第一个函数调用时它抛出了AccessViolationException.然而,将缓冲区大小加倍两倍(32768),与原始缓冲区大小相比没有任何影响 - 从1.0直接上升至9.9并再次向下,它停在1.9并抛出异常.
编辑:默认为ANSI,因此它是ANSI.没有问题.这是内存分配问题吗?
| 归档时间: |
|
| 查看次数: |
1497 次 |
| 最近记录: |