在C#StringBuilder结构中导入C dll
我需要为C dll导入一个函数GDPI,我想在一个C#应用程序中使用。 我的问题是一个参数是一个struct CFSPI,在这个struct中我有其他struct: PII PPI LPPCC LPPOL LPPOP 我的问题是LPPOL的原始结构是C在C#StringBuilder结构中导入C dll,c#,c,marshalling,stringbuilder,C#,C,Marshalling,Stringbuilder,我需要为C dll导入一个函数GDPI,我想在一个C#应用程序中使用。 我的问题是一个参数是一个struct CFSPI,在这个struct中我有其他struct: PII PPI LPPCC LPPOL LPPOP 我的问题是LPPOL的原始结构是C typedef struct tagCFS_PRINT_OVLINFO { DWORD dwOverlayType; TCHAR szFormPath[MAX_PATH]; DWORD dwFormID; BOOL bFormIdFixed; }
typedef struct tagCFS_PRINT_OVLINFO {
DWORD dwOverlayType;
TCHAR szFormPath[MAX_PATH];
DWORD dwFormID;
BOOL bFormIdFixed;
} CFS_PRINT_OVLINFO, *LPCFS_PRINT_OVLINFO;
CFSPI结构是:
typedef struct tagCFS_PRINTINFO {
DWORD wCopies;
DWORD dwPrintInterval;
DWORD dwPrintSpeed;
DWORD dwPageID;
DWORD dwJobID;
CFS_PRINT_IMGINFO pii;
CFS_PRINT_PAPERINFO ppi;
LPCFS_PRINT_CCORRECTINFO lppcc;
LPCFS_PRINT_OVLINFO lppol;
LPCFS_PRINT_OPTION lppop;
LPVOID lpReserve1;
LPVOID lpReserve2;
DWORD dwReserve1;
DWORD dwReserve2;
} CFS_PRINTINFO, *LPCFS_PRINTINFO;
函数定义是
int CFTGetDefaultPrintInfo(
IN LPTSTR lptPrinterName, // Printer name to obtain the print information
OUT CFSPI* lpPrtInfo // Default print information
);
我试着用C#by来定义
当我调用我拥有的函数时
Blockquote不可能删除champ’lppol’de type’App.CFS_PRINTINFO:处理信息后的类型定义,主要是管理类型/非管理类型与执法人员的非有效性组合
我尝试使用字符串,但没有成功
你有什么想法吗
谢谢要创建固定缓冲区,您不需要使用
StringBuilder
internal unsafe struct CFS_PRINT_OVLINFO
{
internal uint dwOverlayType; // Overlay, Print type
internal fixed char szFormPath[MAX_PATH]; // Form file path
internal uint dwFormID; // Form file ID
internal bool bFormIdFixed; // Wether to fix the form ID
}
您必须启用不安全代码,才能使其正常工作
但是C代码与您在C中创建的代码之间存在更多的不兼容:
lppcc
、lppol
和lppop
都是指针,因此它们应该创建为指针,或者创建为IntPtr
:
internal unsafe struct CFS_PRINTINFO
{
internal uint dwCopies;
internal uint dwPrintInterval;
internal uint dwPrintSpeed;
internal uint dwPageID;
internal uint dwJobID;
internal CFS_PRINT_IMGINFO pii;
internal CFS_PRINT_PAPERINFO ppi;
internal CFS_PRINT_CCORRECTINFO* lppcc;
internal CFS_PRINT_OVLINFO* lppol;
internal CFS_PRINT_OPTION* lppop;
internal IntPtr lpReserve1;
internal IntPtr lpReserve2;
internal uint dwReserve1;
internal uint dwReserve2;
}
甚至extern方法的定义也不正确,应该是(假设CFSPI
是CFS\u PRINTINFO
):
您是否尝试在StringBuilder上添加MarshalAs属性?只需使用MarshalAsAttribute并将该字段声明为Char[]szFormPath(如果是ASCII或UTF-8,则为Byte)。顺便说一句,我会将StructLayout或FieldOffset添加到您的结构中!当我更改内部StringBuilder szFormPath;//表单文件路径由[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]内部字符串szFormPath;//表单文件路径我还有一个问题,那就是PInvokeStackInBalance你知道我如何找到有问题的变量吗?非常感谢你,没有问题。
internal unsafe struct CFS_PRINTINFO
{
internal uint dwCopies;
internal uint dwPrintInterval;
internal uint dwPrintSpeed;
internal uint dwPageID;
internal uint dwJobID;
internal CFS_PRINT_IMGINFO pii;
internal CFS_PRINT_PAPERINFO ppi;
internal CFS_PRINT_CCORRECTINFO* lppcc;
internal CFS_PRINT_OVLINFO* lppol;
internal CFS_PRINT_OPTION* lppop;
internal IntPtr lpReserve1;
internal IntPtr lpReserve2;
internal uint dwReserve1;
internal uint dwReserve2;
}
[DllImport("mydll.dll")]
internal static extern int CFTGetDefaultPrintInfo(string lptPrinterName, out CFSPI lpPrtInfo);