c++中的定义是这样的:
struct BASEOPTIONS
{
int nBCStyle;
BYTE * lpszBCData;
Int nLens;
int nPrinterDpi;
BOOL bStandard;
BYTE Reversed[10];
}
我现在的定义是这样的:
public struct BASEOPTIONS
{
public IntPtr nBCStyle;
public string lpszBCData;
public int nLens;
public int nPrinterDpi;
public bool bStandard;
public byte[] Reversed ;
}
在用到这个结构的时候报错:检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“PCApp!PCApp.clsPrint::SetBCBaseParam”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。应该怎么定义呢?我认为是最后一个参数的问题,BYTE Reversed[10];请教高人,应该怎么定义呢?
struct BASEOPTIONS
{
int nBCStyle;
BYTE * lpszBCData;
Int nLens;
int nPrinterDpi;
BOOL bStandard;
BYTE Reversed[10];
}
我现在的定义是这样的:
public struct BASEOPTIONS
{
public IntPtr nBCStyle;
public string lpszBCData;
public int nLens;
public int nPrinterDpi;
public bool bStandard;
public byte[] Reversed ;
}
在用到这个结构的时候报错:检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“PCApp!PCApp.clsPrint::SetBCBaseParam”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。应该怎么定义呢?我认为是最后一个参数的问题,BYTE Reversed[10];请教高人,应该怎么定义呢?
public struct BASEOPTIONS
{
public IntPtr nBCStyle;
public string lpszBCData;
public int nLens;
public int nPrinterDpi;
public bool bStandard;
public byte[] Reversed;
}
public class Program
{
public static void Main(string[] args)
{
BASEOPTIONS b;
b.Reversed = new byte[10]; }
}
给数组初始化一下
把byte[] Reversed 改为IntPtr Reversed也不行,或者是不应该这样改?
{
public fixed byte Reversed[10];
}
正常的调用应该如下这种方式:
class MyClass
{
MyStruct ms = new MyStruct(); //可以NEW 也可以不用NEW
MyStruct ms; //系统总是提供无参构造
public void PrintName()
{
ms.name="Hello!"; //方法中赋值
Console.Write(ms.name);
}
}
{
public int nBCStyle;
public string lpszBCData;
public int nLens;
public int nPrinterDpi;
public FontStruct szFont;
public bool bStandard;
public fixed byte Reversed[10] ;
}
改成这样的话,在这一句public fixed byte Reversed[10] 的public上提示错误:
指针和固定大小缓冲区只能在不安全的上下文中使用
又提示:不安全代码只会在使用 /unsafe 编译的情况下出现
{
public fixed byte Reversed[10];
}项目--属性--生成--勾选 允许不安全代码
谢谢,确实要new,不然会提示使用了未赋值的变量。我是这要调用的:
public struct BASEOPTIONS
{
public int nBCStyle;
public string lpszBCData;
public int nLens;
public int nPrinterDpi;
public FontStruct szFont;
public bool bStandard;
public byte[] Reversed ;
}public bool Print()
{
BASEOPTIONS bo = new BASEOPTIONS();
bo.nBCStyle = 0;
bo.lpszBCData = "123432423432";
bo.nLens = bo.lpszBCData.Length;
bo.bStandard = false;
bo.nPrinterDpi = 600;
bo.Reversed = new byte[10];
SetBCBaseParam(bo);
}
另外,SetBCEachParam的声明这样的:
public static extern bool SetBCBaseParam(BASEOPTIONS pBaseOption);
public unsafe struct BASEOPTIONS
{
public int nBCStyle;
public string lpszBCData;
public int nLens;
public int nPrinterDpi;
public FontStruct szFont;
public bool bStandard;
public fixed byte Reversed[10] ;
}
public bool Print()
{
BASEOPTIONS bo = new BASEOPTIONS();
bo.nBCStyle = 0;
bo.lpszBCData = "123432423432";
bo.nLens = bo.lpszBCData.Length;
bo.bStandard = false;
bo.nPrinterDpi = 600;SetBCBaseParam(bo);
}这样还是报同样的错。
type
BASEOPTIONS = record
nBCStyle : Integer;
lpszBCData : PBYTE;
nLens : Integer;
nPrinterDpi : Integer;
bStandard:boolean;
Reversed:array[1..10] of byte;
end; base.nBCStyle := 0 ;
base.lpszBCData := PBYTE(strCodeMsg);
base.nLens := Length(strCodeMsg);
base.bStandard := false;
base.nPrinterDpi := 600 ;
{
public int nBCStyle;
public IntPtr lpszBCData;
public int nLens;
public int nPrinterDpi;
public FontStruct szFont;
public bool bStandard;
public fixed byte Reversed[10] ;
}
public bool Print()
{
string s= "123432423432";
BASEOPTIONS bo = new BASEOPTIONS();
bo.nBCStyle = 0;
bo.lpszBCData = System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(s);
bo.nLens = s.Length;
bo.bStandard = false;
bo.nPrinterDpi = 600;SetBCBaseParam(bo);
}这样试试,lpszBCData 是个指向字符串的指针
谢谢,还是不行。
上面给的是DELPHI的,VB的参考是这样的:
Private Type BASEOPTIONS
nBCStyle As Long
lpszBCData As String
nLens As Long
nPrinterDpi As Long
bStandard As Boolean
Reversed(1 To 10) As Long
End Type
Dim base As BASEOPTIONS
'对结构进行赋值
strMsg = txtBCData.Text
base.nBCStyle = 0
base.lpszBCData = strMsg
base.nLens = Len(strMsg)
base.bStandard = False
base.nPrinterDpi = 600
//SetBCBaseParam
[DllImport("NlsCodeMid.dll", CharSet = CharSet.Ansi)]
public static extern bool SetBCBaseParam(BASEOPTIONS pBaseOption);
在C++中的定义是这样的:
BOOL SetBCBaseParam(BASEOPTIONS * pBaseOption)
public static extern bool SetBCBaseParam(ref BASEOPTIONS pBaseOption);用ref,传地址