SAP Netweaver 7.0路由连接SAP服务器测试内存读取错误求助
解决SAP NetWeaver 7.0连接时的"The memory cannot be read"错误
问题背景
我在项目中需要测试SAP NetWeaver 7.0的路由字符串能否成功连接SAP服务器,已经在Visual Studio 2017中创建了控制台应用并配置了连接参数,但程序运行时抛出错误:The memory cannot be read。
我的代码如下:
#include <stdlib.h> #include <stdio.h> #include "stdafx.h" #include "include/sapnwrfc.h" void errorHandling(RFC_RC rc, RFC_ERROR_INFO*errorInfo, RFC_CONNECTION_HANDLE connection) { printfU(cU("%s: %s\n"), errorInfo->key, errorInfo->message); /* It's better to close the TCP/IP connection cleanly, than to just let the backend get a "Connection reset by peer" error...*/ if (connection != NULL) RfcCloseConnection(connection, errorInfo); exit(1); } int mainU(int argc, SAP_UC** argv) { RFC_RC rc = RFC_OK; RFC_CONNECTION_PARAMETER loginParams[6]; RFC_ERROR_INFO errorInfo; RFC_CONNECTION_HANDLE connection; // ----------------------------------------------- // OPEN CONNECTION // ----------------------------------------------- // Create logon parameter list loginParams[0].name = cU("gwhost"); loginParams[0].value = cU("80.**.***.**"); loginParams[1].name = cU("sysnr"); loginParams[1].value = cU("00"); loginParams[2].name = cU("client"); loginParams[2].value = cU("800"); loginParams[3].name = cU("user"); loginParams[3].value = cU("jsar12"); loginParams[4].name = cU("lang"); loginParams[4].value = cU("EN"); loginParams[5].name = cU("****"); loginParams[5].value = cU("Abc"); // Open connection connection = RfcOpenConnection(loginParams, 6, &errorInfo); if (connection == NULL) errorHandling(rc, &errorInfo, NULL); return 0; }
预期结果:成功连接至SAP Router
问题分析与解决方案
我帮你梳理下几个关键问题,这应该就是引发内存读取错误的根源:
1. 密码参数名称错误
你代码里把密码参数写成了****,这完全不符合SAP RFC的参数规范!正确的密码参数名称应该是passwd,使用错误的参数名会导致RFC库在解析参数列表时出现内存访问异常,这大概率是你当前错误的直接原因。
2. 项目字符集配置不匹配
printfU和cU是SAP提供的宽字符处理宏,如果你的Visual Studio项目字符集设置不对(比如用了多字节字符集而非Unicode),也可能触发内存读取问题。请检查项目设置:
- 右键项目 → 属性 → 配置属性 → 常规 → 字符集,选择使用Unicode字符集
3. RFC库与平台/VS版本不兼容
要确保你使用的sapnwrfc.h和对应的库文件(sapnwrfc.lib/sapnwrfc.dll)与你的Visual Studio 2017、项目平台(x86/x64)完全匹配。32位项目用64位库,或者反过来,必然会导致内存访问错误。
修正后的核心代码片段
把密码参数名称修正后,这部分代码应该是这样的:
// ... 其他代码保持不变 loginParams[5].name = cU("passwd"); // 替换原来的****为正确的参数名 loginParams[5].value = cU("Abc"); // ... 其他代码保持不变
额外调试建议
如果修正后还是有问题,可以试试这些方法:
- 在调用
RfcOpenConnection前,打印所有参数的名称和值,确认参数配置没有遗漏或错误; - 启用SAP RFC的调试日志:在参数列表中添加
trace参数,值设为3,这样会生成详细的日志文件,帮你定位具体的连接问题:// 注意要把loginParams数组长度改成7,同时RfcOpenConnection的第二个参数也改为7 loginParams[6].name = cU("trace"); loginParams[6].value = cU("3");
内容的提问来源于stack exchange,提问作者J.Sarali
相关产品推荐
相关产品推荐

