C#如何调用dll里面的extern "C" int _stdcall db_encrypt(char *in, char *out, int size);是[DllImport("data_api.dll")]
public static extern int db_encrypt(out char input,out char output,int size)还是
public static extern int db_encrypt(string input,string output,int size)?
对C++不熟.
public static extern int db_encrypt(out char input,out char output,int size)还是
public static extern int db_encrypt(string input,string output,int size)?
对C++不熟.
解决方案 »
- c# split() 问题
- 正则提取--新手问题
- openFileDialog 选择文件时是否能设置成查看文件的“详细信息”
- 请教下这些类库在三层结构中都代表了些什么?
- winform下(C#)用treeview绑定xml动态生成特定的树,急用!!!
- 我想买《Visual C#.NET Web应用程序设计入门与提高》大家觉的怎么样?
- 如何把InfoPath的表格嵌入到各种宿主应用程序中,包括Windows窗体、Microsoft Office 文档以及 Microsoft Internet Explorer等。
- 命名管道接收监听代码的问题
- 诚聘,.net(c#)开发人员,待遇优,专职,北京工作
- MDI子窗体的问题,高手应该很简单,在线等待。
- 大小B有什么区别呢?
- winForm TreeView控件
这样好像行~
public static extern int db_encrypt(char[] input,char[] output,int size)
如果输入输入不是字符串的话,用db_encrypt(byte[] input, byte[] output, int size);
感觉上一般第一个是输入,第二是输出,所以请试一下:public static extern int db_encrypt(string input, [Out]StringBuilder output,int size)
public static extern int db_encrypt(byte[] input, byte[] output,int size)
[DllImport("data_api.dll")]
public static extern int db_encrypt(byte[] input,byte[] output,int size);private btn_click(sender,e)
{
byte[] input=System.Text.Encoding.UTF8.GetBytes("no");
byte[] output=new byte[2550];
db_encrypt(input,output,input.Length);
string s=new string(System.Encoding.UTF8.GetChars(output));
MessageBox.Show(s);
}
//输出:E8C26A4967A24757我再调试C++
CString str="no";
char o[2550];
for(int i=0;i<=2550;j++)
{
o[i]='0';
}
db_encrypt(str.GetBuffer(1),o,str.GetLength());
//这里o为:9E54E0A97D3A4744
我改用
db_encrypt("no",o,2)
//则o输出来的跟C#里面的一致:E8C26A4967A24757
实际o为:9E54E0A97D3A4744,所以C#里面的E8C26A4967A24757是不对的。
C++的GetBuffer()是什么意思,(我用LPTSTR p=str.GetBuffer(1)查看显示Name:p value:0X00dc381c "no")转换到C#该如何处理?
这是由于你的C++项目默认用了_UNICODE或UNICODE预编译定义。
由于这时候CString内部用的是宽字符,str用ASCII字符初始化后,内部缓冲区实际为'n' '\0' 'o' '\0' '\0' '\0'
你用GetBuffer()返回的缓冲区,加上str.GetLength的2,实际上是加密'n''\0'这两个字节。这当然跟加密"no"不一样了。
而C#下面是按"no"加密?
那C#下要对'n','\0'加密怎么写,我用char[] c = new char[] { 'n','\0'};
byte[] input = System.Text.Encoding.UTF8.GetBytes(c);
byte[] output = new byte[2550];
db_encrypt(input, output, 2);
是C478A0C104C5D78F,也不是9E54E0A97D3A4744
byte* pBytes = str.GetBuffer();
然后设置断点,确认pBytes[0]==0x6E pBytes[1]==0x02、确认C#中string s=new string(System.Encoding.UTF8.GetChars(output))的转换方式,跟C++中的显示是兼容的。
[DllImport("data_api.dll",CharSet = CharSet.Ansi)]
static extern int db_encrypt(StringBuilder input, StringBuilder output, int size); [DllImport("data_api.dll",CharSet =CharSet.Ansi)]
static extern int db_decrypt(StringBuilder input, StringBuilder output, int size);
解决了!