求助 c# 调用dll出现的问题.

minwent 2006-10-26 04:49:55
本人在网上搜索到一用c++编写的des加密算法.我将其编译为dll后调用发现回传的密文和在c++环境下回传的密文不一样.不知道是不是编码不一样导致此问题.有没有哪位大侠遇到过类似问题?如何解决?

以下是编译为dll的源代码(有些省略了)
//mydll.cpp---------------------------------------------------
// mydll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}


//////////////////////////////////////////////////////////////////////////
/*
Provided by 王俊川, Northeastern University (www.neu.edu.cn)
Email: blackdrn@sohu.com
This product is free for use.
*/
//////////////////////////////////////////////////////////////////////////

#include "memory.h"
#include "mydll.h"

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// Code starts from Line 130
//////////////////////////////////////////////////////////////////////////
bool Des_Go(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type)
{

if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) )
return false;
SetKey(Key, keylen);
if( !Is3DES ) { // 1次DES
for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8)
DES(Out, In, &SubKey[0], Type);
} else{ // 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)
for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8) {
DES(Out, In, &SubKey[0], Type);
DES(Out, Out, &SubKey[1], !Type);
DES(Out, Out, &SubKey[0], Type);
}
}
return true;
}
以下省略.....
//////////////////////////////////////////////////////////////////////////
// Code ends at Line 231
//////////////////////////////////////////////////////////////////////////

以下为dll的调用入口点
//mydll.h---------------------------------------------------------------------------
enum {ENCRYPT,DECRYPT};
extern "C" _declspec(dllexport) bool Des_Go(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);

以下是c#调用的的写法
[DllImport("mydll.dll",CharSet=CharSet.Ansi)]
public static extern bool Des_Go(StringBuilder outstr, StringBuilder instr, int datalen,string key,int keylen,bool type);

调用:
private void button1_Click(object sender, System.EventArgs e)
{
StringBuilder outstr = new StringBuilder();
outstr.Append("ABCDEFG");
string key = "123456";
bool b = DES.Des_Go(outstr,outstr,outstr.Length,key,key.Length,false);

byte [] outchars = System.Text.Encoding.Default.GetBytes(outstr.ToString());
this.textBox2.Text = outstr.ToString();
}
结果outchars 和在c++调用后的返回值不一样.
不知道是不是我这样调用不对.还是我的dll写的不对.还望高人不吝赐教.
...全文
395 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
minwent 2006-10-27
  • 打赏
  • 举报
回复
结束帖子
minwent 2006-10-27
  • 打赏
  • 举报
回复
回愚翁:
我这样调用就行了。返回的byte[]和在c++下面调用的是一样的。谢了:)
[DllImport("mydll.dll",CharSet=CharSet.Ansi)]
public static extern bool Des_Go(
[Out,MarshalAs(UnmanagedType.LPArray)]byte[] outstr,
[MarshalAs(UnmanagedType.LPArray)]byte[] instr, int datalen,
[MarshalAs(UnmanagedType.LPArray)]byte[] key,int keylen,bool type);
wkcode 2006-10-27
  • 打赏
  • 举报
回复
不错,留个记号
minwent 2006-10-26
  • 打赏
  • 举报
回复
好的,我明天回学校试试看.先谢过了.愚翁:)
cnhgj 2006-10-26
  • 打赏
  • 举报
回复
函数导出时注意调用约定__stdcall
Knight94 2006-10-26
  • 打赏
  • 举报
回复
Sorry!

[DllImport("mydll.dll",CharSet=CharSet.Ansi)]
public static extern bool Des_Go(
[Out,MarshalAs(UnmanagedType.LPStr)]StringBuilder outstr,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder instr, int datalen,
[MarshalAs(UnmanagedType.LPStr)]string key,int keylen,bool type);
Knight94 2006-10-26
  • 打赏
  • 举报
回复
Have a try!
[DllImport("mydll.dll",CharSet=CharSet.Ansi)]
public static extern bool Des_Go(
[Out,MarshalAs(UnmanagedType.LPStr)]StringBuilder outstr,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder instr, int datalen,
[Out,MarshalAs(UnmanagedType.LPStr)]string key,int keylen,bool type);

minwent 2006-10-26
  • 打赏
  • 举报
回复
在上面很清楚啊.我用c#调用的.
飞哥 2006-10-26
  • 打赏
  • 举报
回复
你c++下代码不全?
----------
调用dll的部分呢?

--------

extern "C" _declspec(dllimport)
bool Des_Go(char *Out,char *In,
long datalen,const char *Key,
intkeylen,bool Type = ENCRYPT);

HINSTANCE dll = LoadLibrary("mydll.dll");
....
zzd8310 2006-10-26
  • 打赏
  • 举报
回复
帮顶
minwent 2006-10-26
  • 打赏
  • 举报
回复
在c++是这样调用的.补上...
// 3-Des test

#include "WjcDes.h"
#include "stdio.h"
#include "string.h"
#include "memory.h"

void main()
{
char key[]= "123456",buf[255];
char str[]="ABCDEFG";


memset(buf, 0, sizeof(buf));
strcpy(buf, str);
puts("\nBefore encrypting");
puts(buf);

Des_Go(buf, buf, sizeof(str), key, sizeof(key), ENCRYPT);
puts("\nAfter encrypting");
puts(buf);

Des_Go(buf, buf, sizeof(str), key, sizeof(key), DECRYPT);
puts("\nAfter decrypting");
puts(buf);

getchar();
}
相关推荐
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-26 04:49
社区公告

让您成为最强悍的C#开发者