C#调用C++ dll中下面这个方法,在C#中应如何声明?

lanshifei 2010-11-09 11:00:23
C#调用C++ dll中下面这个方法,在C#中应如何声明?

C++中原函数:
bool Get_e2RND( char *&pszOutData, char *pszPass,char *&pszOutNewData, char *pszstrNewPass,char *pszeSESS, char *pszeRND, unsigned char ucClientType)

急急..........在线等............谢谢谢谢谢!!!
...全文
148 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dobzhansky 2010-11-09
  • 打赏
  • 举报
回复
内存访问问题一般是调用约定不对
dllimport 默认是 stdcall,
c/cpp 默认是 cdecl ,

你试试哇
火柴没帽 2010-11-09
  • 打赏
  • 举报
回复

[DllImport("你的动态库名字.dll", EntryPoint = "Get_e2RND")]
public static extern bool Get_e2RND(string pszOutData, string pszPass, string pszOutNewData, string pszstrNewPass, string pszeSESS, string pszeRND, byte ucClientType);


试试看,应该是这个样子
ruanwei1987 2010-11-09
  • 打赏
  • 举报
回复
wp494298399 2010-11-09
  • 打赏
  • 举报
回复
C++ 不懂 但可以告诉你C#调用外部DLL的步骤 添加引用 找到需要用到的DLL 就可以直接在程序中使用了
lanshifei 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyazhe 的回复:]
char*用string替代别的一样。
[/Quote]

不行我试过,报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的错。
lanshifei 2010-11-09
  • 打赏
  • 举报
回复
这个是原函数:
bool Get_e2RND( char *&pszOutData, char *pszPass,char *&pszOutNewData, char *pszstrNewPass,char *pszeSESS, char *pszeRND, unsigned char ucClientType)
{
void *pObj = CreateOctO();
if (pObj == NULL)
return false;
bool revalue;
revalue=(((COctOAPI*)pObj)->Get_e2RND(pszOutData, pszPass, pszOutNewData, pszstrNewPass, pszeSESS, pszeRND, ucClientType));
return revalue;
}

bool COctOAPI::Get_e2RND( LPSTR &pszOutData, LPSTR pszPass,
LPSTR &pszOutNewPass, LPSTR pszstrNewPass,
LPSTR pszESESS, LPSTR pszERND, UCHAR ucClientType)
{
bool bRtn = false;

CSHA1 sha1;

BYTE *pHashKey1 = NULL;
int hvKey1Len = 0;

if (ucClientType == 0)// Client Version use SHA
{
hvKey1Len = sha1.GetHashVal(pszPass, lstrlen(pszPass), &pHashKey1);
}
else if (ucClientType == 1)// AE Version use MD5
{
if (!Encode2MD5(pszPass, (unsigned char* &)pHashKey1, hvKey1Len))
{
if (pHashKey1)
{
free(pHashKey1);
pHashKey1 = NULL;
}
hvKey1Len = 0;
}
}

if (hvKey1Len == 0)
{
return false;
}

// Convert eRnd & eSESS to binary (hex format)
UCHAR *eRND;
int eRNDLen;
ConvertHexText2Binary((UCHAR*) pszERND, lstrlen(pszERND), eRND, eRNDLen);

UCHAR *eSESS;
int eSESSLen;
ConvertHexText2Binary((UCHAR*) pszESESS, lstrlen(pszESESS), eSESS, eSESSLen);

// Decrypt eRnd & eSESS
CBlowfishEncrypt bf;
bf.BF_set_key(hvKey1Len, pHashKey1);

UCHAR *RND;
bf.BF_StringEncrypt(eRND, RND, eRNDLen, BF_DECRYPT);

UCHAR *SESS;
bf.BF_StringEncrypt(eSESS, SESS, eSESSLen, BF_DECRYPT);

// hSESS KEY2
CSHA1 sha2;
BYTE *pHashKey2;
int hvKey2Len = sha2.GetHashVal((LPTSTR) SESS, eSESSLen, &pHashKey2);

if (hvKey2Len == 0)
{
return false;
}

//Encrypt RND, newpass
CBlowfishEncrypt bfRND;
bfRND.BF_set_key(hvKey2Len, pHashKey2);

UCHAR *e2RND;
bfRND.BF_StringEncrypt(RND, e2RND, eRNDLen, BF_ENCRYPT);

//finish result
UCHAR* stre2RND;
int ne2RNDlen;
ConvertBinary2HexText(e2RND, eRNDLen, stre2RND, ne2RNDlen);

pszOutData = strlwr((LPSTR)stre2RND);

if (lstrlen(pszstrNewPass) != 0)
{
UCHAR *enPWD;
int nenPWDLen = bfRND.BF_StringEncrypt((UCHAR*)pszstrNewPass, enPWD, lstrlen(pszstrNewPass), BF_ENCRYPT);

//finish result
UCHAR* strenPWD;
int nenPWDlen;
ConvertBinary2HexText(enPWD, nenPWDLen, strenPWD, nenPWDlen);

pszOutNewPass = strlwr((LPSTR)strenPWD);

// free memory
free(enPWD);
}

bRtn = true;

//free memory
free(pHashKey1);
free(eRND);
free(eSESS);
free(RND);
free(SESS);
free(pHashKey2);
free(e2RND);

return bRtn;
}

我只要得到pszOutData的值,这个应该怎么改才能让C#更好的调用,我没有学过C++不会改!
兔子-顾问 2010-11-09
  • 打赏
  • 举报
回复
char*用string替代别的一样。
gomoku 2010-11-09
  • 打赏
  • 举报
回复
原形很不好(名字不好,传参方式不统一,没有内存释放合同)。
lanshifei 2010-11-09
  • 打赏
  • 举报
回复
自己测过之后,这样才正确:
public static extern bool Get_e2RND(ref string pszOutData, string pszPass, ref string pszOutNewData, string pszstrNewPass, string pszeSESS, string pszeRND, byte ucClientType);

还是谢谢大家!!!

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧