哪位大侠帮我把C++里的函数移植到.net里使用啊?谢谢

qiannianyaojing 2014-05-20 01:29:46
C++里有如下代码:

bool CWHService::GetMachineID(TCHAR szMachineID[LEN_MACHINE_ID])
{
//变量定义
TCHAR szMACAddress[LEN_NETWORK_ID]=TEXT("");

//网卡标识
GetMACAddress(szMACAddress);

//转换信息
ASSERT(LEN_MACHINE_ID>=LEN_MD5);
CWHEncrypt::MD5Encrypt(szMACAddress,szMachineID);

return true;
}

//机器标识
CWHService::GetMachineIDEx(TCHAR szMachineID[LEN_MACHINE_ID])
{
//变量定义
TCHAR szMACAddress[LEN_NETWORK_ID]=TEXT("");

//网卡标识
WORD wMacSize=GetMACAddress(szMACAddress);

//硬盘标识
DWORD *pbuf=(DWORD*)szMACAddress;
WORD wIndex=(wMacSize+sizeof(DWORD)-1)/sizeof(DWORD);
LPCTSTR pszHardDisk[]={TEXT("C:\\"),TEXT("D:\\"),TEXT("E:\\")};
for (WORD i=wIndex;i<CountArray(pszHardDisk);i++)
{
ASSERT(CountArray(pszHardDisk)>(i-wIndex));
GetVolumeInformation(pszHardDisk[i-wIndex],NULL,0,pbuf+i,NULL,NULL,0,NULL);
}

//转换信息
ASSERT(LEN_MACHINE_ID>=LEN_MD5);
CWHEncrypt::MD5Encrypt(szMACAddress,szMachineID);

return true;
}

//网卡地址
CWHService::GetMACAddress(TCHAR szMACAddress[LEN_NETWORK_ID])
{
//变量定义
HINSTANCE hInstance=NULL;

//执行逻辑
__try
{
//加载 DLL
hInstance=LoadLibrary(TEXT("NetApi32.dll"));
if (hInstance==NULL) __leave;

//获取函数
typedef BYTE __stdcall NetBiosProc(NCB * Ncb);
NetBiosProc * pNetBiosProc=(NetBiosProc *)GetProcAddress(hInstance,"Netbios");
if (pNetBiosProc==NULL) __leave;

//变量定义
NCB Ncb;
LANA_ENUM LanaEnum;
ZeroMemory(&Ncb,sizeof(Ncb));
ZeroMemory(&LanaEnum,sizeof(LanaEnum));

//枚举网卡
Ncb.ncb_command=NCBENUM;
Ncb.ncb_length=sizeof(LanaEnum);
Ncb.ncb_buffer=(BYTE *)&LanaEnum;
if ((pNetBiosProc(&Ncb)!=NRC_GOODRET)||(LanaEnum.length==0)) __leave;

//获取地址
if (LanaEnum.length>0)
{
//变量定义
tagAstatInfo Adapter;
ZeroMemory(&Adapter,sizeof(Adapter));

//重置网卡
Ncb.ncb_command=NCBRESET;
Ncb.ncb_lana_num=LanaEnum.lana[0];
if (pNetBiosProc(&Ncb)!=NRC_GOODRET) __leave;

//获取状态
Ncb.ncb_command=NCBASTAT;
Ncb.ncb_length=sizeof(Adapter);
Ncb.ncb_buffer=(BYTE *)&Adapter;
Ncb.ncb_lana_num=LanaEnum.lana[0];
strcpy((char *)Ncb.ncb_callname,"*");
if (pNetBiosProc(&Ncb)!=NRC_GOODRET) __leave;

//获取地址
for (INT i=0;i<6;i++)
{
ASSERT((i*2)<LEN_NETWORK_ID);
_stprintf(&szMACAddress[i*2],TEXT("%02X"),Adapter.AdapterStatus.adapter_address[i]);
}
}
}

//结束清理
__finally
{
//释放资源
if (hInstance!=NULL)
{
FreeLibrary(hInstance);
hInstance=NULL;
}

//错误断言
if (AbnormalTermination()==TRUE)
{
ASSERT(FALSE);
}
}

return true;
}
bool CWHEncrypt::MD5Encrypt(LPCTSTR pszSourceData, TCHAR szMD5Result[LEN_MD5])
{
//变量定义
CMD5Aide MD5Aide;
UCHAR szResult[16];
CT2CA strSrcData(pszSourceData);

//加密密文
MD5Aide.MD5Update((BYTE *)((LPCSTR)strSrcData),lstrlenA(strSrcData)*sizeof(CHAR));
MD5Aide.MD5Final(szResult);

//输出结果
szMD5Result[0]=0;
for (INT i=0;i<16;i++) _stprintf(&szMD5Result[i*2],TEXT("%02X"),szResult[i]);

return true;
}


我的意思是 需要在.net里按C++里写的方法获取 电脑的唯一标识 GetMachineIDEx 要这个函数返回的机器码结果(MD5加密过的),将C++代码封装为DLL 放到.net调用也可以 或者直接转换成.NET 的方法也可以;哪位大神教教我 ,我是菜鸟
...全文
384 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huitian1621 2014-09-18
  • 打赏
  • 举报
回复
引用 9 楼 yangyunzhao 的回复:
比较靠谱且偷懒的办法是,封装一个dll供c#调用。否则C++那边修改一次代码,你这边还得修改一次,类死了
如果这样的话,那如果遇到发布到iis,dll不在客服端,这个该怎么解决呢?
yangyunzhao 2014-09-15
  • 打赏
  • 举报
回复
比较靠谱且偷懒的办法是,封装一个dll供c#调用。否则C++那边修改一次代码,你这边还得修改一次,类死了
huitian1621 2014-09-15
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
MD5编码仅供参考:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <memory.h>
const unsigned int s[4][4]={{7,12,17,22},{5,9,14,20},{4,11,16,23},{6,10,15,21}};
const unsigned long t[64]={//t[i]=4294967296*fabs(sin(i+1));
 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,
 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
};
const int serial[64]={
 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
 1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
 5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9
};
void func(unsigned long& a,
          unsigned long b,
          unsigned long c,
          unsigned long d,
          unsigned long M,
          unsigned long t,
          int s,
          int turn) {
    unsigned long temp;
    switch(turn) {
    case 0:
        temp=(b&c)|((~b)&d);
        break;
    case 1:
        temp=(d&b)|((~d)&c);
        break;
    case 2:
        temp=b^c^d;
        break;
    case 3:
        temp=c^(b|(~d));
        break;
    }
    temp+=M+t+a;
    _asm {
        mov ecx,s
        rol temp,cl
    }
    a=b+temp;
}
void MD512(const unsigned long M[16],unsigned long hash[4]) {
    int i,j,index=0;
    for (i=0;i<4;i++)
        for (j=0;j<4;j++) {
            func(hash[0],hash[1],hash[2],hash[3],M[serial[index]],t[index],s[i][0],i);
            index++;
            func(hash[3],hash[0],hash[1],hash[2],M[serial[index]],t[index],s[i][1],i);
            index++;
            func(hash[2],hash[3],hash[0],hash[1],M[serial[index]],t[index],s[i][2],i);
            index++;
            func(hash[1],hash[2],hash[3],hash[0],M[serial[index]],t[index],s[i][3],i);
            index++;
        }
}

void MD5(char* M,int nLen,unsigned long output[4]) {
    int i,j;
    unsigned long Hash[4]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
    unsigned long hash[4];

    //填充
    __int64 BitsLen=nLen*8;
    int oldlen=nLen;
    while(nLen%64!=56) {
        M[nLen++]=0;
    }
    M[oldlen]=0x80u;
    *(__int64*)(M+nLen)=BitsLen;
    nLen+=8;

    //开始处理分组
    for (i=0;i<nLen;i+=64) {
        memcpy(hash,Hash,sizeof(long)*4);
        MD512((const unsigned long*)&M[i],hash);//处理512bits分组
        for (j=0;j<4;j++)
            Hash[j]+=hash[j];
    }

    //处理输出。
    for (i=0;i<4;i++)
        for (j=3;j>=0;j--) {
            *((char*)(output+i)+j)=*((char*)(Hash+i)+3-j);
        }
}
int main() {
    int i;
    char szMessage[1000]={0};
    printf("input a string:\n>>>");
    scanf("%s",szMessage);
    unsigned long output[4];
    MD5(szMessage,strlen(szMessage),output);
    for (i=0;i<4;i++)
        printf("%08lx",output[i]);
    printf("\n");
    return 0;
}
他这里应该不光是MD5算法了,还有个加壳运算,这个麻烦啊
qiannianyaojing 2014-05-21
  • 打赏
  • 举报
回复
不是说觉得从大型解决方案里随便截取出来一段代码 就省力,而是需要和这个一模一样的方法获取机器码;
赵4老师 2014-05-20
  • 打赏
  • 举报
回复
MD5编码仅供参考:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <memory.h>
const unsigned int s[4][4]={{7,12,17,22},{5,9,14,20},{4,11,16,23},{6,10,15,21}};
const unsigned long t[64]={//t[i]=4294967296*fabs(sin(i+1));
 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,
 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
};
const int serial[64]={
 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
 1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
 5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9
};
void func(unsigned long& a,
          unsigned long b,
          unsigned long c,
          unsigned long d,
          unsigned long M,
          unsigned long t,
          int s,
          int turn) {
    unsigned long temp;
    switch(turn) {
    case 0:
        temp=(b&c)|((~b)&d);
        break;
    case 1:
        temp=(d&b)|((~d)&c);
        break;
    case 2:
        temp=b^c^d;
        break;
    case 3:
        temp=c^(b|(~d));
        break;
    }
    temp+=M+t+a;
    _asm {
        mov ecx,s
        rol temp,cl
    }
    a=b+temp;
}
void MD512(const unsigned long M[16],unsigned long hash[4]) {
    int i,j,index=0;
    for (i=0;i<4;i++)
        for (j=0;j<4;j++) {
            func(hash[0],hash[1],hash[2],hash[3],M[serial[index]],t[index],s[i][0],i);
            index++;
            func(hash[3],hash[0],hash[1],hash[2],M[serial[index]],t[index],s[i][1],i);
            index++;
            func(hash[2],hash[3],hash[0],hash[1],M[serial[index]],t[index],s[i][2],i);
            index++;
            func(hash[1],hash[2],hash[3],hash[0],M[serial[index]],t[index],s[i][3],i);
            index++;
        }
}

void MD5(char* M,int nLen,unsigned long output[4]) {
    int i,j;
    unsigned long Hash[4]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
    unsigned long hash[4];

    //填充
    __int64 BitsLen=nLen*8;
    int oldlen=nLen;
    while(nLen%64!=56) {
        M[nLen++]=0;
    }
    M[oldlen]=0x80u;
    *(__int64*)(M+nLen)=BitsLen;
    nLen+=8;

    //开始处理分组
    for (i=0;i<nLen;i+=64) {
        memcpy(hash,Hash,sizeof(long)*4);
        MD512((const unsigned long*)&M[i],hash);//处理512bits分组
        for (j=0;j<4;j++)
            Hash[j]+=hash[j];
    }

    //处理输出。
    for (i=0;i<4;i++)
        for (j=3;j>=0;j--) {
            *((char*)(output+i)+j)=*((char*)(Hash+i)+3-j);
        }
}
int main() {
    int i;
    char szMessage[1000]={0};
    printf("input a string:\n>>>");
    scanf("%s",szMessage);
    unsigned long output[4];
    MD5(szMessage,strlen(szMessage),output);
    for (i=0;i<4;i++)
        printf("%08lx",output[i]);
    printf("\n");
    return 0;
}
赵4老师 2014-05-20
  • 打赏
  • 举报
回复
有人以为 从某个大型解决方案里随便截取出来一段代码,经过很小的修改,就能放到别处去协调工作。 而事实是 远不如自己根据其逻辑重新写一遍更省时省力。
大_猫 2014-05-20
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
楼上这个只限于通信啊,C++功能实现类你打算怎么办?
大_猫 2014-05-20
  • 打赏
  • 举报
回复
Handle-Body 设计可以让你实现这个 你需要将你的C++类重新设计一下。Handle-Body网上很多资料,你自己随便找就能找到。 然后只留接口出来,这让能做到跨语言平台的移植。
qiannianyaojing 2014-05-20
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
想法是好的,但是 我C++里的代码是我从这个大型解决方案里截取出来的,两个没法放到一块去协调工作啊;
赵4老师 2014-05-20
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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