因项目需要,我要调用别人提供的dll,对方给的函数原型:
函数原型: function rdInfo_SSCID(t_SSCinfo: PSSCInfo): SmallInt;
数据结构:
type TSSCInfo = record
SSCID: array[0..69] of BYTE;
end;
PSSCInfo = ^TSSCInfo;
看不懂是什么语言,找了一些资料自己写了个调用demo,总是不成功,我的代码如下:
声明代码:
[StructLayout(LayoutKind.Sequential)]
public struct TSSCInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 70)]
public byte[] SSCID;
} [DllImport("szssc.dll")]
static extern int rdInfo_SSCID(IntPtr Info);调用的代码:
TSSCInfo info = new TSSCInfo();
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TSSCInfo)));
Marshal.StructureToPtr(info, ptr, false);
int rtnVal = rdInfo_SSCID(ptr);
info = (TSSCInfo)Marshal.PtrToStructure(ptr, typeof(TSSCInfo));
string val = System.Text.Encoding.Default.GetString(info.SSCID);
Marshal.FreeHGlobal(ptr);
MessageBox.Show("返回值:" + rtnVal.ToString() + "\t数据:" + val);dll放在程序同一个目录下的
请大虾们指教!很急。。
函数原型: function rdInfo_SSCID(t_SSCinfo: PSSCInfo): SmallInt;
数据结构:
type TSSCInfo = record
SSCID: array[0..69] of BYTE;
end;
PSSCInfo = ^TSSCInfo;
看不懂是什么语言,找了一些资料自己写了个调用demo,总是不成功,我的代码如下:
声明代码:
[StructLayout(LayoutKind.Sequential)]
public struct TSSCInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 70)]
public byte[] SSCID;
} [DllImport("szssc.dll")]
static extern int rdInfo_SSCID(IntPtr Info);调用的代码:
TSSCInfo info = new TSSCInfo();
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TSSCInfo)));
Marshal.StructureToPtr(info, ptr, false);
int rtnVal = rdInfo_SSCID(ptr);
info = (TSSCInfo)Marshal.PtrToStructure(ptr, typeof(TSSCInfo));
string val = System.Text.Encoding.Default.GetString(info.SSCID);
Marshal.FreeHGlobal(ptr);
MessageBox.Show("返回值:" + rtnVal.ToString() + "\t数据:" + val);dll放在程序同一个目录下的
请大虾们指教!很急。。
解决方案 »
- wpf中如何处理通过image控件的句柄,来显示视频。
- WPF KeyDown 事件处理出现双 Ctrl 同时按下被无视的问题.
- DataTable的Select方法可以写成类似SQL语句那种带参数的形式么?
- 图书管理系统
- 在一个文本中,那个单词出现次数最多
- 我是菜鸟,c#中dataGrid打印?
- 如何将一个字符串分解成两个字符串?
- 点击一个按钮,出现一个Canvas,怎么实现不点按钮,不点Canvas,让这个Canvas不显示?
- CSDN用java做的通知系统Bug连天,而且这么久了也不见改进。
- 再求教--使用Socket监听端口(郁闷)
- 小妹正做一段程序,遇到难题啦,请各位哥哥姐姐帮忙
- "将当前窗体本身传给另一个窗体"怎么解释?
int rtnVal = rdInfo_SSCID(ptr);
string val = Marshal.PtrToBStr(ptr);
Marshal.FreeHGlobal(ptr);
忘了说下,对方给的dll有很多个,因为我用C++的工具看了下,发现这个函数就在szssc.dll中所以就import这个
其他的还有
CTDRD10U.dll
dcic32.dll
GoldDes.dll
hdssse32.dll
SSSE32.dll
SZSBCardProj1.ocx
TY_SSSE32.dll
那个ocx做什么用的?
你用VC6的Depends工具再检查一下szssc.dll有否依赖于其它Dll,如果有,要一起拷到相关目录你的想法很好,神马都不管,先保证返回值正确再说或者先拿到VC下调用试试
static extern short rdInfo_SSCID(IntPtr Info);[StructLayout(LayoutKind.Sequential,Pack=4)]
public struct TSSCInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 70)]
public byte[] SSCID;
}http://baike.baidu.com/view/3539221.htm
SmallInt需要 2 个字节存储的整数http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.structlayoutattribute.pack.aspx
另外默认情况下StructLayout属性Pack=4,可能 需要调整Pack的大小来决定TSSCInfo的占用空间
我的代码是不是有出问题呢?