.NET调用DLL返回值问题

a522134398 2014-07-14 11:18:05
DLL方法名:GetParam
[功能定义]
HRESULT WINAPI GetParam(HANDLE pDataHandle, LPCTSTR paramName, LPTSTR ParamValue, UINT nMaxValueLenth)
[功能描述]
该接口函数用于取返回参数。
[参数说明]
HANDLE pDataHandle:功能调用的处理句柄,由接口函数CreateInstace()创建。
LPCTSTR paramName:返回变量的参数名称。
LPTSTR ParamValue:保存返回值的变量。
UINT nMaxValueLenth:变量ParamValue的分配内存字节数。
==================================================================
C# Code
声名:
[DllImport("HNBridge.dll")]
public static extern long GetParam(long pDataHandle, string paramName,
ref StringBuilder prtStr, int nMaxValueLenth);

调用:

StringBuilder mes= new StringBuilder(1024);
his_result = GetParam(handle, "MSG",ref mes, mes.Capacity);


为什么mes总是获取不到返回值,求大神打救。怎样才能获取到返回值???

...全文
293 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2014-07-15
  • 打赏
  • 举报
回复
引用 7 楼 a522134398 的回复:
[quote=引用 4 楼 xian_wwq 的回复:] [quote=引用 楼主 a522134398 的回复:] DLL方法名:GetParam [功能定义] HRESULT WINAPI GetParam(HANDLE pDataHandle, LPCTSTR paramName, LPTSTR ParamValue, UINT nMaxValueLenth) [功能描述] 该接口函数用于取返回参数。 [参数说明] HANDLE pDataHandle:功能调用的处理句柄,由接口函数CreateInstace()创建。 LPCTSTR paramName:返回变量的参数名称。 LPTSTR ParamValue:保存返回值的变量。 UINT nMaxValueLenth:变量ParamValue的分配内存字节数。 ================================================================== C# Code
声名:
       [DllImport("HNBridge.dll")]
public static extern long GetParam(long pDataHandle, string paramName,
ref StringBuilder prtStr, int nMaxValueLenth);
调用:

         StringBuilder mes= new StringBuilder(1024);
         his_result = GetParam(handle, "MSG",ref mes, mes.Capacity);
为什么mes总是获取不到返回值,求大神打救。怎样才能获取到返回值???
在DLLImport中加上 CharSet = CharSet.Ansi再试试。 一般情况下, c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名 使用了StringBuilder就不需要ref了。 his_result 是不是0?会不会是函数调用有别的特殊要求? [/quote] 现在可以返回了,但是StringBuilder读出来的是乱码,请问如何解决是好?[/quote] 从没有返回到返回乱码,也是个进步, 讲讲这中间你做了什么修改,这样也好帮你分析呀。 其实还有个更直接的,找dll的提供方,询问有没有什么特殊约定
bdmh 2014-07-14
  • 打赏
  • 举报
回复
可能dll并不返回新内容,所以你先搞清楚dll的作用,有没有返回
a522134398 2014-07-14
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
去掉 ref 试试
试过了,还是不行。是不是DLL没有把返回值写到StringBuilder里面去?
bdmh 2014-07-14
  • 打赏
  • 举报
回复
a522134398 2014-07-14
  • 打赏
  • 举报
回复
引用 4 楼 xian_wwq 的回复:
[quote=引用 楼主 a522134398 的回复:] DLL方法名:GetParam [功能定义] HRESULT WINAPI GetParam(HANDLE pDataHandle, LPCTSTR paramName, LPTSTR ParamValue, UINT nMaxValueLenth) [功能描述] 该接口函数用于取返回参数。 [参数说明] HANDLE pDataHandle:功能调用的处理句柄,由接口函数CreateInstace()创建。 LPCTSTR paramName:返回变量的参数名称。 LPTSTR ParamValue:保存返回值的变量。 UINT nMaxValueLenth:变量ParamValue的分配内存字节数。 ================================================================== C# Code
声名:
       [DllImport("HNBridge.dll")]
public static extern long GetParam(long pDataHandle, string paramName,
ref StringBuilder prtStr, int nMaxValueLenth);
调用:

         StringBuilder mes= new StringBuilder(1024);
         his_result = GetParam(handle, "MSG",ref mes, mes.Capacity);
为什么mes总是获取不到返回值,求大神打救。怎样才能获取到返回值???
在DLLImport中加上 CharSet = CharSet.Ansi再试试。 一般情况下, c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名 使用了StringBuilder就不需要ref了。 his_result 是不是0?会不会是函数调用有别的特殊要求? [/quote] 现在可以返回了,但是StringBuilder读出来的是乱码,请问如何解决是好?
shockcqyc 2014-07-14
  • 打赏
  • 举报
回复
[DllImport("HNBridge.dll",CharSet = CharSet.Ansi)] public static extern long GetParam(long pDataHandle, string paramName, StringBuilder prtStr, int nMaxValueLenth); StringBuilder mes= new StringBuilder(1024); his_result = GetParam(handle, "MSG",mes, mes.Capacity); 最好是将你的函数原型发上来看看
md5e 2014-07-14
  • 打赏
  • 举报
回复
[DllImport("HNBridge.dll")]这个文件是放哪里的?
xian_wwq 2014-07-14
  • 打赏
  • 举报
回复
引用 楼主 a522134398 的回复:
DLL方法名:GetParam [功能定义] HRESULT WINAPI GetParam(HANDLE pDataHandle, LPCTSTR paramName, LPTSTR ParamValue, UINT nMaxValueLenth) [功能描述] 该接口函数用于取返回参数。 [参数说明] HANDLE pDataHandle:功能调用的处理句柄,由接口函数CreateInstace()创建。 LPCTSTR paramName:返回变量的参数名称。 LPTSTR ParamValue:保存返回值的变量。 UINT nMaxValueLenth:变量ParamValue的分配内存字节数。 ================================================================== C# Code
声名:
       [DllImport("HNBridge.dll")]
public static extern long GetParam(long pDataHandle, string paramName,
ref StringBuilder prtStr, int nMaxValueLenth);
调用:

         StringBuilder mes= new StringBuilder(1024);
         his_result = GetParam(handle, "MSG",ref mes, mes.Capacity);
为什么mes总是获取不到返回值,求大神打救。怎样才能获取到返回值???
在DLLImport中加上 CharSet = CharSet.Ansi再试试。 一般情况下, c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名 使用了StringBuilder就不需要ref了。 his_result 是不是0?会不会是函数调用有别的特殊要求?
【源码免费下载链接】:https://renmaiwang.cn/s/2vpei 在工业自动化技术领域中,西门子PLC(可编程逻辑控制器)因其稳定性和灵活性而备受关注,尤其是在S7-1200和S7-1500系列设备中,其通信功能的稳定性得到了显著增强。对于开发者而言,能够高效地与这些设备进行通信是这项技术特征对于开发者来说具有重要意义。"S7.NET.DLL及官方指导文件.rar"这一资源为C#语言开发者提供了一个关键的技术支持材料,使实现西门子Profinet CPU设备之间的通信开发变得更加便捷。S7.NET.DLL作为西门子官方推出的动态链接库,专为C#编程设计,旨在帮助开发者高效地与PLC设备进行交互。该软件包整合了丰富的功能模块和类群,涵盖了数据读写、复杂程序执行以及实时监控等功能。通过引用此DLL文件,开发者可以在C#开发环境中直接调用相关API函数,无需深入研究底层通讯协议的具体细节,从而显著降低了开发难度。官方指导文件则为开发者提供了详尽的技术支持材料和实践示例,在帮助用户掌握S7.NET.DLL使用方法的同时也提升了操作效率。这份资源通常包含以下内容:1. 安装与配置指南:详细说明如何将DLL文件成功集成到项目中,包括必要的技术参数设置等步骤;2. API功能解析:全面阐述库中各类函数的用途、输入输出参数及返回值解释,为开发者提供清晰的技术参考文档;3. 实战示例集:通过实际编程案例展示如何读写PLC设备变量以及如何执行高级操作如程序下载和状态监控等技术;4. 错误处理策略:介绍常见错误及其解决方案,帮助开发者快速定位并修复问题;5. 性能优化建议:提供提升通信效率和系统稳定性的一些建议。对于熟悉C#编程的开发者而言,S7.NET.DLL库无疑是一个强大的工具资源,它不仅简化了与西门子PLC设备之间的交互界面,同时也支持所有Profinet CPU系列设备

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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