无法定位程序输入点SHGetKnownFolderPath于动态链接库SHELL32.dll上 是怎么回事?开游戏时跳出来的

已举报 回答 关注

无法定位程序输入点SHGetKnownFolderPath于动态链接库SHELL32.dll上 是怎么回事?开游戏时跳出来的

  • 回答数

    9

  • 浏览数

    15,972

9个回答 默认排序
  • 默认排序
  • 按时间排序

已采纳
XP系统吧,都不装win7
你的游戏有问题,不能在你的机子上运行。

先更新你DX9.0C到最新版本
不行的话,可能是软件本身有错误,不兼容你的系统。

建议:换高版本的操作系统运行,如果还不行,就换游戏的版本。
取消 评论

或者是SHELL32.dll这个动态链接文件丢失的缘故。

假定是的话,shell32.dll是存放在Windows\System32系统文件夹的说,网络搜索下载个存放再相关位置就可以。

312970165.jpg 

~~(中关村问题库整理专用,会对老问题进行编辑复制)ZOL问答是目前国内最专业的IT问题解决平台,上百位权威专家编辑团队在线为您解答所有IT问题。ZOL问答是一个提供笔记本问答、手机问答、摄影问答、硬件问答及数码问答等IT问题的解决平台,更多IT问题解决欢迎来中关村在线ZOL问答,另外也可以关注ZOL问答的微信公众号:zol_wenda,或者微博搜索ZOL问答,也可以关注ZOL问答的今日头条号和悟空问答号,我们会第1时间对你提出的问题作出详尽的解答。


取消 评论
小技巧:如果无法进入桌面,可以启动安全模式或者使用PE启动电脑,然后修复。

一定要选择与系统版本一致的DLL才可以

无法定位、丢失mss32.dll文件。需要先下载安装mss32.dll,然后才能正常使用
可以重新下载一个mss32.dll文件,复制到c:\windows\system32文件夹【64位系统在C:\Windows\SysWOW64目录】,然后【开始-运行-输入regsvr32 mss32.dll】即可。
下载地址:
mss32.dll免费高速下载_DLL文件下载,DLL文件丢失,系统文件下载
http://51dll.com/dll/file/?40983.1.htm

详细安装方法: http://tieba.baidu.com/p/3707831838
取消 评论
第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一个整数加法求和:

LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 导入定义:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a,int b);
}
在C#中调用测试:

int iSum = RefComm.mySum(,);

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

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

LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;}
C# 导入定义:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中调用测试:

string strDest="";
string strTmp= RefComm.mySum("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("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再调用测试:

string strDest="";
string strTmp= RefComm.mySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均不对,含不可见字符。再修改 C# 导入定义,将CharSet从Auto修改为Ansi:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
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("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
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("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
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("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
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# 的动态链接库,两个动态链接库就在同一个目录下运行。
取消 评论
你把那个链接库删掉就好了。要是出另一个,把那个也删了,就ok了。halo2通关飘过···
取消 评论
好像是没安装windows live吧
取消 评论
LZ你好你遇到问题可能是以下原因导致的
1:你的EXE可执行文件放的位置不对,比如你应该放在e:\game\xxx\aaa下面
你却放在了e:\game\xxx\下面 与aaa是同一级目录 所以才会导致应用程序无法连接到动态链接库。
解决方法:将你的EXE可执行文件放到正确的位置
取消 评论
这个说明是你运行的程序调用了 SHELL32.dll,但找不到对应的函数。但是这个文件是系统自带的(带最多图标的那个文件),也就是说,你的那个程序不是为你目前用的这个系统设计的,所以它调用了不兼容的函数。解决方法是你可以尝试把对应系统的 SHELL32.dll 放到程序目录下,如果它不是默认先搜索系统目录,也许会可以运行。
取消 评论
加载全部9个答案 加载中...
ZOL问答 > 键盘 > LG键盘 > 功能 > 无法定位程序输入点SHGetKnownFolderPath于动态链接库SHELL32.dll上 是怎么回事?开游戏时跳出来的

相关产品

  • LG 游戏键盘

    LG 游戏键盘

    参考价:停产    评分:8.0

    热门排行榜:未上榜

  • 京东搜一搜

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

提示

确定要取消此次报名,退出该活动?