战争之人突击小队无法定位程序输入点steamapps于动态链接库steam_api.dll

如题所述

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

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# 的动态链接库,两个动态链接库就在同一个目录下运行。本回答被网友采纳

...GetSteamInstallPath于动态链接库steam_api.dll上
你好,Steam_api.dll是基于Steam游戏平台程序运行的文件,若是出现无法定位程序输入点于动态链接库上之时,一般是代表着这个文件损坏或丢失。你可在腾讯电脑管家的软件管理中搜索Steam下载试试。若是仅仅下载这个文件,则建议放到C:\\Windows\\System32文件夹中,并可运行CMD后,在弹出的命令提示符窗口中输入...

...输出点SteamUseStats于动态链接库steam.api.dll上
一、如果您的系统提示“没有找到steam_api.dll”或者“缺少steam_api.dll”等类似错误信息,请把steam_api.dll下载到本机 打开腾讯电脑管家——电脑诊所——软件问题——【丢失DLL文件】二、直接拷贝该文件到系统目录里:C:WindowsSystem32目录下。三、然后打开“开始-运行-输入regsvr32 steam_api.dll”...

无法定位程序输入点SteamUserStats于动态链接库steam_api.dll上
我玩的是你一个叫闪克的游戏,也出现了这种问题。你的那个估计是免安装版的,但是有的组件需要安装,找到那个安装的东西,点击安装。就行了

战争之人突击小队2无法定位程序输入点SteamApps于动态链接库steam_ap...
去下载一个steam api.dll 这个自带的可能不适合你的电脑 到百度一搜steam api.dll就有了

打开暗黑血统 系统提示:无法定位程序输入点SteamUserStats于动态链接库...
steam_api.dll是硬盘版游戏必须的DLL文件,譬如帝国全面战争、恶魔势力等。如何安装和卸载steam_api.dll文件?1,解压所下载的文件;2,拷贝该DLL文件到系统system32文件夹里。【C:\\windows\\system32】3,点击开始——运行 ◆安装该DLL文件的方法:输入regsvr32 steam_api.dll ▲卸载该DLL文件的方法:...

...RestartAppIfNecessary于动态链接库steam_api.dll上
1、病毒原因导致的,建议将杀毒软件升级到最新版本,然后再安全模式下全盘扫描病毒 2、软件修复,可以通过金山卫士、360安全卫士的系统修复功能修复一下试试 3、开始--运行--输入regsvr32 报错的DLL文件名称(全名),重新注册下DLL文件试试 4、开始——运行——msconfig——启动——把加载项***.DLL的...

...RegisterCallResult于动态链接库steam_api.dll上
无法定位动态链接库的原因 1.病毒木马导致的,比较典型的病毒是绑架类木马,它是一种新型破坏性极强的木马与传统病毒不同,它是通过绑架系统文件dll实现开机启动,该木马主要表现, 2. 升级某个软件导致的。重装该软件即可解决该问题。 3.自己误操作造成的。 无法定位程序输入点的修复方案: 软件修复:...

...API_WriteMiniDump于动态链接库steam_api.dll上
regsvr32 c:\\windows\\sysytem32\\steam_api.dll (即打开命令提示符,然后输入指令)或者使用系统光盘引导进入安装界面,按R键进入"恢复故障台",然后在命令提示符下输入指令:cd x:\\i386 expand steam_api.dll_ C:\\windows\\sysytem32\\steam_api.dll (x光驱所在盘,输入一条命令按回车键,注意空格...

无法定位程序输入点CreateInterface于动态链接库steam-api.dll...
缺失steam-api.dll文件的问题,修复步骤如下:1、通过一定的途径获取到steam-api.dll文件,例如网上寻找并下载。2、将steam-api.dll文件复制到“C:\\Windows\\System32”这个目录下。3、点击“开始菜单”,选择“运行”按钮,输入:regsvr32 steam-api.dll,点击确定。4、此时弹出安装完成steam-api.dll...

无法定位程序输入点SteamUserStats于动态链接steam-api.dll
1(打开启动对话框)――步骤如下:开始-运行-msconfig-启动-把加载项***.dll的那个勾勾去掉。 重启电脑,通常到这就可以了,如果还弹出来再进行第二步;2(打开注册表)――步骤如下:开始-运行-regedit: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run HKEY_LOCAL_MACHINE\\...

相似回答