// 原型(C编写)
签名函数
int SEC_CliSign(unsigned char *str,
int strl,
unsigned char *sig,
int *sigl,
char *pin);
输入参数:
str,准备进行签名的数据
strl,准备进行签名的数据长度
pin, 智能卡或USBKey的密码(如果不要求每次签名输入密码,可省略该参数)
输出参数:
sig,数据签名+签名方安全介质名称
sigl,(数据签名+签名方安全介质名称)的长度
返 回 值:
SEC_SUCCESS,成功
其它,失败,错误代码另见
// 申明
// 请求交易上传结构(由于其他调用需要用到,必须这么申明)
public struct UpInfo
{
public string SignId;
public byte[] UpSign;
public byte[] XmlInfo;
}
public class LibWrap
{
// 客户端对交易报文签名函数
[DllImport("seccli.dll",EntryPoint="SEC_CliSign")]
public static extern int SEC_CliSign(
ref byte[] XmlInfo,
int strLen,
out byte[] UpSign,
out int nSigLen
);
}
// call
// 上传结构
UpInfo UpInfo = new UpInfo(); UpInfo.SignId = "CLIENT";
UpInfo.UpSign = new byte[180];
UpInfo.XmlInfo = new byte[sendData.Length]; char[] _sendData = sendData.ToCharArray();//sendData 是接口传输的XML报文
for(int i=0;i<sendData.Length;i++)
{
UpInfo.XmlInfo[i] = (byte)_sendData[i];
}
// 返回代码
int retId = 0;
int strLen = UpInfo.XmlInfo.Length;
int nSigLen = UpInfo.UpSign.Length;
retId = LibWrap.SEC_CliSign(ref UpInfo.XmlInfo, strLen, out UpInfo.UpSign, out nSigLen);
按照以上方式编写程序,存在如下错误:
* Exception: ------------------------------------------------------------------
System.ApplicationException: 未将对象引用设置到对象的实例。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
at Sky.BankAgent.Assembly.CCB.LibWrap.SEC_CliSign(Byte[]& XmlInfo, Int32 strLen, Byte[]& UpSign, Int32& nSigLen)
at Sky.BankAgent.Assembly.CCB.Rules.Send(String sendData)
at Sky.BankAgent.Assembly.CCB.Rules.SignIn(String sendData)
at Sky.BankAgent.Assembly.CCB.BankTransactor.SignIn(Boolean compel)
at Sky.BankAgent.Assembly.CCB.BankTransactor.Transact(DataSet instructs)
--- 内部异常堆栈跟踪的结尾 ---
at Sky.BankAgent.Assembly.CCB.BankTransactor.Transact(DataSet instructs)请指出问题的原因,谢谢!
签名函数
int SEC_CliSign(unsigned char *str,
int strl,
unsigned char *sig,
int *sigl,
char *pin);
输入参数:
str,准备进行签名的数据
strl,准备进行签名的数据长度
pin, 智能卡或USBKey的密码(如果不要求每次签名输入密码,可省略该参数)
输出参数:
sig,数据签名+签名方安全介质名称
sigl,(数据签名+签名方安全介质名称)的长度
返 回 值:
SEC_SUCCESS,成功
其它,失败,错误代码另见
// 申明
// 请求交易上传结构(由于其他调用需要用到,必须这么申明)
public struct UpInfo
{
public string SignId;
public byte[] UpSign;
public byte[] XmlInfo;
}
public class LibWrap
{
// 客户端对交易报文签名函数
[DllImport("seccli.dll",EntryPoint="SEC_CliSign")]
public static extern int SEC_CliSign(
ref byte[] XmlInfo,
int strLen,
out byte[] UpSign,
out int nSigLen
);
}
// call
// 上传结构
UpInfo UpInfo = new UpInfo(); UpInfo.SignId = "CLIENT";
UpInfo.UpSign = new byte[180];
UpInfo.XmlInfo = new byte[sendData.Length]; char[] _sendData = sendData.ToCharArray();//sendData 是接口传输的XML报文
for(int i=0;i<sendData.Length;i++)
{
UpInfo.XmlInfo[i] = (byte)_sendData[i];
}
// 返回代码
int retId = 0;
int strLen = UpInfo.XmlInfo.Length;
int nSigLen = UpInfo.UpSign.Length;
retId = LibWrap.SEC_CliSign(ref UpInfo.XmlInfo, strLen, out UpInfo.UpSign, out nSigLen);
按照以上方式编写程序,存在如下错误:
* Exception: ------------------------------------------------------------------
System.ApplicationException: 未将对象引用设置到对象的实例。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
at Sky.BankAgent.Assembly.CCB.LibWrap.SEC_CliSign(Byte[]& XmlInfo, Int32 strLen, Byte[]& UpSign, Int32& nSigLen)
at Sky.BankAgent.Assembly.CCB.Rules.Send(String sendData)
at Sky.BankAgent.Assembly.CCB.Rules.SignIn(String sendData)
at Sky.BankAgent.Assembly.CCB.BankTransactor.SignIn(Boolean compel)
at Sky.BankAgent.Assembly.CCB.BankTransactor.Transact(DataSet instructs)
--- 内部异常堆栈跟踪的结尾 ---
at Sky.BankAgent.Assembly.CCB.BankTransactor.Transact(DataSet instructs)请指出问题的原因,谢谢!
解决方案 »
- C# 未将对象引用设置到对象的实例
- Unity Application Block 如何配置泛型接口映射?
- 数据库如何读取image并且显示
- 高手请指点:自定义控件拖到Form里vs2005就自动退出了?
- C#同类事件如何简化处理?
- 怎样打包
- 一系统多用户权限,应该怎样实现好(想封装起来,以便扩展以及维护)
- 怎样将base16编码的字符串转化为base64编码的字符串?
- 请教:WinForm中调用WinRar,如何等待压缩文件生成以后,再执行压缩文件的拷贝。谢谢!
- C#获得主板序列号、
- 请教如何获取当前程序文件夹的路径
- 为什么当我单击DataGridView中的某个行标题时,这一行中我自定义的单元格都不见了,郁闷!
public static extern int SEC_CliSign(
[In,MarshalAs(UnmanagedType.LPArray)]
byte[] XmlInfo,
int strLen,
[Out,MarshalAs(UnmanagedType.LPArray, SizeConst=180)]
byte[] UpSign,
ref int nSigLen
);//call
retId = LibWrap.SEC_CliSign( UpInfo.XmlInfo, strLen, UpInfo.UpSign, ref nSigLen);
System.ApplicationException: 未将对象引用设置到对象的实例。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
at Sky.BankAgent.Assembly.CCB.LibWrap.SEC_CliSign(Byte[] XmlInfo, Int32 strLen, Byte[] UpSign, Int32& nSigLen)
public static extern int SEC_CliSign(
[In,MarshalAs(UnmanagedType.LPArray)]
byte[] XmlInfo,
int strLen,
[Out,MarshalAs(UnmanagedType.LPArray, SizeConst=180)]
byte[] UpSign,
ref int nSigLen,
[Out,MarshalAs(UnmanagedType.LPArray)]
byte[] pin);
System.ApplicationException: 未将对象引用设置到对象的实例。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
at Sky.BankAgent.Assembly.CCB.LibWrap.SEC_CliSign(Byte[] XmlInfo, Int32 strLen, Byte[] UpSign, Int32& nSigLen, Byte[] pin)
at Sky.BankAgent.Assembly.CCB.Rules.Send(String sendData)还有其他办法可以试吗?就这个问题已经折腾我好几天啦。
例如:
StringBuilder
或者
[In,MarshalAs(UnmanagedType.LPTStr )]
string
* Exception: ------------------------------------------------------------------
System.ApplicationException: 未将对象引用设置到对象的实例。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
at Sky.BankAgent.Assembly.CCB.LibWrap.SEC_CliSign(Byte[] XmlInfo, Int32 strLen, Byte[] UpSign, Int32& nSigLen, String pin)
申明
// 客户端对交易报文签名函数
[DllImport("seccli.dll",EntryPoint="SEC_CliSign")]
public static extern int SEC_CliSign(
[In,MarshalAs(UnmanagedType.LPArray, SizeConst=3800)]
byte[] XmlInfo,
int strLen,
[Out,MarshalAs(UnmanagedType.LPArray, SizeConst=180)]
byte[] UpSign,
ref int nSigLen,
[In,MarshalAs(UnmanagedType.LPTStr )]
string pin
);//CALL
string pin = " ";retId = LibWrap.SEC_CliSign(UpInfo.XmlInfo, strLen, UpInfo.UpSign, ref nSigLen,pin);不知道哪里错了,其他地方申明和赋值都不变。
#include <stdio.h>
#include "teapi.h"
#include "secmid.h"
/*请求报文*/
typedef struct person{
char cpOpid[20];
char account[17];
unsigned char info[40];
unsigned char upSig[179];
}PERSON;
/*响应报文*/
typedef struct resbuf{
char cpOpid[20];
int result;
}RESBUF;void main(int argc, char **argv)
{
char JYM[]="cmfptx"; /* 交易码 */
char ReqFile[500],EchoFile[500];
PERSON reqbuf; /* 发送到服务器的请求报文结构 */
RES resbuf; /* 接收自服务器的响应报文结构 */
int nRet = 0;
int nSigLen = 0,nEncLen = 0;
char account[16]; memset(&reqbuf,0,sizeof(reqbuf));
memset(&resbuf,0,sizeof(resbuf));
memset(ReqFile,0,sizeof(ReqFile));
memset(EchoFile,0,sizeof(EchoFile));
strcpy(reqbuf->cpOpid,"381200252");
strcpy(reqbuf->info,"Important Privacy Information of Client");
strcpy(account,"8596581462875362");
……
/* 对info字段进行签名 */
nRet = SEC_CliSign(reqbuf->info, sizeof(reqbuf->info), reqbuf->upSig, &nSigLen);
if (nRet)
{
logmsg("签名失败\n");
return;
}
StringBuilder str,
int strLen,
StringBuilder UpSign,
ref int nSigLen,
StringBuilder pin
);