加载动态连接库文件失败该如何解决

加载动态连接库文件失败该如何解决,第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)运行输入msconfig回车,打开系统配置实用程序,在启动项目中查找一个名为dmdll”,如果有将它前面的钩去掉,然后按应用确定(如果没有跳过)。
(2)运行输入regedit回车打开注册表,选编辑查找一个名为“dmdll”的键值项,找到后删除,多查找几次删除干净,然后重新启动电脑即可。
(3)去掉自启动项
开始/运行输入regedit回车打开注册表编辑器,依次展开
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] 右侧,
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]在右侧,
看看有没有你要找的选项(dmdll),如果有删除,重启即可。


到如下路径:C:\Program
Files\Common
Files\Microsoft
Shared\DAO找到扩展名为DLL或dll的两个文件。我的这两个文件分别是
DAO350DLL
dao360dll

将你刚才找到的两个文件复制到你安装
“Office办公软件”的“OFFICE11”文件夹下面。例如我是复到如下路径:G:\Office2003\OFFICE11,因为我是将Office2003安装到G盘Office2003里面。

在注册表里注册这两个文件:
因为我是将这两个文件都放到了G:\Office2003\OFFICE11\
下面。在开始菜单运行里输入:如下注册路径:
Regsvr32exe
"G:\Office2003\OFFICE11\DAO350DLL"
Regsvr32exe
"G:\Office2003\OFFICE11\dao360dll"
五择自网上如何处理MS
Access
2000+
以上的出现的“加载DLL”错误信息最近在将外部数据库(EXCEL、文本文件、其他数据库文件)导入到MS
ACCESS
2000+中的时候就遇到“加载DLL”的错误信息,开始以为缺少什么文件,于是用安装文件进行了修复,但是结果还是一样。于是,只好Google
一下,发现了一个很好的解决方案:
>开始运行MSCONFIG,选择启动把加载出错的文件不要打勾`~~
如果不行``
开始运行REGEDIT,选择编辑——查找——查找目标把DLL出错的文件书进去``
电脑会显示一些DLL出错的文件~~
把这些文件删掉就可以了``
重新一下计算机看一下!

原因:杀毒软件删除或隔离了相关dll使用户无法打开程序。

1、首先打开电脑桌面左下角的Windows图标选项,在出现的菜单栏中打开“运行”。

2、然后在d出来的运行窗口中,点击输入命令“regedit”,按下“enter”按键。

3、然后在d出来的窗口中点击打开HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion中的Run项,点击选择“360Disabled”项。

4、然后在d出来的右侧窗口中,删除开机提示的含有相关dll的键值,重启电脑就完成了。


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

原文地址: https://outofmemory.cn/yw/12678775.html

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

发表评论

登录后才能评论

评论列表(0条)

保存