mail.dll这个动态数据库的作用是什么?mail.dll的导出函数怎么查看?

mail.dll这个动态数据库的作用是什么?mail.dll的导出函数怎么查看?,第1张

第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一个整数加法求和:

LIBEXPORT_API int mySum(int a,int b){ return a+b;}

C# 导入定义:

public class RefComm

{

[DllImport("LibEncryptdll",

EntryPoint=" mySum ",

CharSet=CharSetAuto,CallingConvention=CallingConventionStdCall)]

public static extern int mySum (int a,int b);

}

在C#中调用测试:

int iSum = RefCommmySum(,);

运行查看结果iSum为5,调用正确。第一步试验完成,说明在C#中能够调用自定义的动态链接库函数。

第二步,我定义了字符串 *** 作的函数(简单起见,还是采用前面的函数名),返回结果为字符串:

LIBEXPORT_API char mySum(char a,char b){sprintf(b,"%s",a); return a;}

C# 导入定义:

public class RefComm

{

[DllImport("LibEncryptdll",

EntryPoint=" mySum ",

CharSet=CharSetAuto,

CallingConvention=CallingConventionStdCall)]

public static extern string mySum (string a, string b);

}

在C#中调用测试:

string strDest="";

string strTmp= RefCommmySum("45", strDest);

运行查看结果 strTmp 为"45",但是strDest为空。我修改动态链接库实现,返回结果为串b:

LIBEXPORT_API char mySum(char a,char b){sprintf(b,"%s",a) return b;}

修改 C# 导入定义,将串b修改为ref方式:

public class RefComm

{

[DllImport("LibEncryptdll",

EntryPoint=" mySum ",

CharSet=CharSetAuto,CallingConvention=CallingConventionStdCall)]

public static extern string mySum (string a, ref string b);

}

在C#中再调用测试:

string strDest="";

string strTmp= RefCommmySum("45", ref strDest);

运行查看结果 strTmp 和 strDest 均不对,含不可见字符。再修改 C# 导入定义,将CharSet从Auto修改为Ansi:

public class RefComm

{

[DllImport("LibEncryptdll",

EntryPoint=" mySum ",

CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]

public static extern string mySum (string a, string b);

}

在C#中再调用测试:

string strDest="";

string strTmp= RefComm mySum("45", ref strDest);

运行查看结果 strTmp 为"45",但是串 strDest 没有赋值。第二步实现函数返回串,但是在函数出口参数中没能进行输出。再次修改 C# 导入定义,将串b修改为引用(ref):

public class RefComm

{

[DllImport("LibEncryptdll",

EntryPoint=" mySum ",

CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]

public static extern string mySum (string a, ref string b);

}

运行时调用失败,不能继续执行。

第三步,修改动态链接库实现,将b修改为双重指针:

LIBEXPORT_API char mySum(char a,char b){sprintf((b),"%s",a); return b;}

C#导入定义:

public class RefComm

{

[DllImport("LibEncryptdll",

EntryPoint=" mySum ",

CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]

public static extern string mySum (string a, ref string b);

}

在C#中调用测试:

string strDest="";

string strTmp= RefComm mySum("45", ref strDest);

运行查看结果 strTmp 和 strDest 均为"45",调用正确。第三步实现了函数出口参数正确输出结果。

第四步,修改动态链接库实现,实现整数参数的输出:

LIBEXPORT_API int mySum(int a,int b,int c){ c=a+b; return c;}

C#导入的定义:

public class RefComm

{

[DllImport("LibEncryptdll",

EntryPoint=" mySum ",

CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]

public static extern int mySum (int a, int b,ref int c);

}

在C#中调用测试:

int c=0;

int iSum= RefComm mySum(,, ref c);

运行查看结果iSum 和c均为5,调用正确。

经过以上几个步骤的试验,基本掌握了如何定义动态库函数以及如何在 C# 定义导入,有此基础,很快我实现了变长加密函数在 C# 中的调用,至此目标实现。

三、结论

在 C# 中调用 C++ 编写的动态链接库函数,如果需要出口参数输出,则需要使用指针,对于字符串,则需要使用双重指针,对于 C# 的导入定义,则需要使用引用(ref)定义。

对于函数返回值,C# 导入定义和 C++ 动态库函数声明定义需要保持一致,否则会出现函数调用失败。定义导入时,一定注意 CharSet 和 CallingConvention 参数,否则导致调用失败或结果异常。运行时,动态链接库放在 C# 程序的目录下即可,我这里是一个 C# 的动态链接库,两个动态链接库就在同一个目录下运行。

//第一种方法_静态调用法

1:在DLL的cpp中将函数声明为导出,你已经完成了第一步.

2: 在exe的cpp中加上一句 #pragma comment(lib, "你生成的dll的lib文件") 生成dll后会有一个xxxlib的文件,保存到exe的目录中.

3:声明一种类型,在exe的cpp中声明上面的函数类型. 

4:调用函数

//第二种方法动态调用法

1: 在exe的cpp中使用LoadLibary()把我生成的dll载入.

2: 使用typedef int __stdcall (pfunc) (const char , const char , cstring, int) 定义一个函数类型.

3: pfunc funcaddr = GetProcAddrress() 通过GetProcAddress()获取函数的地址.

4: 调用 函数

 注意:

 你写的代码有点小问题,在导出函数的前面先加上 extern "C" ,这样才能保证dll中的函数名是GenStarPic,否则导出函数的名字会变成一堆乱码,你需要借助LordPe或者depends等工具查看函数名. 

你可以去腾讯电脑管家的电脑诊所看看

我记得上次电脑出现问题需要解决的时候看到DLL丢失修复这项了

管家管理页——工具箱——电脑诊所——DLL丢失——看里面有没有跟你一样的情况——有的话选择立即修复就可以了

在delphi中有一个tdumpexe,你可以用它

tdump

myappexe(

myappdll)>dumptxt来获得其exe或dll的内容

不能直接导入到maya中,必须先导入到3dmax中再倒入到maya中

步骤:

先下载GameAssassin和3dmax插件与需要的dll(这些文件可以到GameAssassin官方网站上下载到),并运行

安装3dmax插件

运行游戏,按下ALT+F7截取模型

打开3dmax并导入模型

打开文件菜单中的导出,格式为OBJ(也可以是FBX)

打开maya并导入你导出的文件就可以了

1用记事本来打开

2用vb或其他编程软件加到控件列表或引用

3用dll函数查看器

软件名称: DLL函数查看器V20

软件简介: 查看DLL,Exe等文件函数

软件作者: 南山软件工作室

运行环境: Win9x,2000,XP

授权方式: 免费软件

软件大小: 199K

更新时间: 2003-9-9 23:14:03

下载次数: 总计:4605次

软件说明: DLL函数查看器V20是在10版的基础上作了重大的改进,不仅支持查看DLL文件的导出函数和引用函数信息及引用函数来源,也支持所有符合PE文件格式的文件,包括EXE文件、OCX文件等的导出函数和引用函数信息。

还有

EXESCOPEexe简体中文版

在华军里有

微软有一个工具叫做dependency walker或者Visual Studio附带的一个工具dumpbin可以查看dll的导出函数名称,函数参数和调用方式(比如__cdecl或__stdcall)在工具里无法显示,需要使用IDA或者OllyDbg等反汇编器将DLL反汇编,通过定位导出函数结尾的retn指令判断参数个数和调用方式。由被调用者平栈通常为__stdcall,由调用者平栈则是__cdecl,平栈的字节数除以字长(例如retn 0C中的0C在x86下是除以4,在x64下除以8)即可得到参数个数(这也是通常,具体问题可能需要具体分析),至于参数意义,那就完全需要头文件支持,或者分析反汇编代码的意义了。

在IDA里,还可以使用F5快捷键将反汇编代码转换为C代码,能稍稍方便一点。

最后一个问题,至于思路的话,你可以查看DLL的导出函数,然后使用Detours类库将原来的函数HOOK一下,做个旁路,在HOOK函数中打印调用内容,这样你在日志文件或调试输出中就能看见调用规律了。纯属个人建议。

还有一个工具叫做API Monitor,能够检测API调用。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11672125.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存