在struct中导入c# StringBuilder结构中的C dll
本文关键字:结构 dll struct 导入 StringBuilder | 更新日期: 2023-09-27 18:13:20
我需要为C dll导入一个函数GDPI,我想在一个c#应用程序中使用。我的问题是一个参数是一个结构CFSPI,在这个结构中我有其他结构:PII PPI LPPCC lppl LPPOP
我的问题是lpol的原始结构是C是
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#中定义
[DllImport("mydll.dll")]
internal static extern int CFTGetDefaultPrintInfo(string lptPrinterName, CFSPI lpPrtInfo);
internal 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;
}
internal struct CFS_PRINT_OVLINFO
{
internal uint dwOverlayType; // Overlay, Print type
internal StringBuilder szFormPath; // Form file path
internal uint dwFormID; // Form file ID
internal bool bFormIdFixed; // Wether to fix the form ID
}
当我调用函数时,我有
Blockquote不可能的de marshaler le champ ' lpol ' de type 'App.CFS_PRINTINFO': La danalys定义定义类型de de ce champ可能定义信息配置,mais danalys的一个组合类型管理型/非管理型/非管理型/无效的您将创建一个新的管理型/être marshalsame。
我尝试使用字符串但不成功..
你有什么主意吗?
谢谢
要创建固定缓冲区,您不使用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_PRINTINFO
):
[DllImport("mydll.dll")]
internal static extern int CFTGetDefaultPrintInfo(string lptPrinterName, out CFSPI lpPrtInfo);