我用C++ 编写一个加密的动态库,加密后是一个16位的数组,我把转成了指针类型返回出去(自己是想着在C#那边好进行转化数据类型的,结果自己坑了),然后C#那边调用,但是不会处理这个指针类型,输出的结果不正确,要么是固定数字,要么是其他的固定字符;所以恳请各位来帮忙。
下面是加密的主函数:
#define EXPORT_DLL extern "C" __declspec(dllexport)
EXPORT_DLL LPCWSTR Encrypt(int sourcein)
{
DES des;
int ret;
char in[16]="123456";
char out[16], outbase[64], outa[16];
int datalen = 16;
unsigned char key[] = {'0', '1', '2', '3', '4', '5', '6', '7'};//
int t=62;//进制
int cc=0;
char s1;
for(int i=0;i<9;i++){
cc=sourcein%t;
sourcein=(sourcein-cc)/t;
s1=_change62(cc);
in[i]=s1;
}
ret = des.CDesEnter((unsigned char *)in, (unsigned char *)out, datalen, key, 0);
fnBase64Encode(out, outbase, strlen(in));
LPCWSTR result=outbase;
return result;
}
下面是C#下调用:
[DllImport("CppDLL.dll", EntryPoint = "Encrypt", CallingConvention = CallingConvention.Cdecl)]
extern static IntPtr Encrypt(int sourcein);
private void ReadyToCreateQRCode_Click(object sender, EventArgs e)
{
int start = 5;
int sourcenumber = 4;
for (int sourcein = start; sourcein < start + sourcenumber; sourcein++)
{
Console.WriteLine(getEncrypt(sourcein));
}
}
unsafe string getEncrypt (int sourcein){
return System.Runtime.InteropServices.Marshal.PtrToStringUni(Encrypt(sourcein));
//return Encrypt(sourcein);
}
希望解决问题:让c++返回的outbase,能在C#上使用。
------解决思路----------------------
不可以在函数内返回局部变量的指针
应该由C#端传入输出的buffer
//c++
EXPORT_DLL void Encrypt(int sourcein, char outbase[64]);
//C#
[DllImport(...)]
static extern void Encrypt(int sourcein, byte[] outbase);