在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。

我尝试使用字符串但不成功..

你有什么主意吗?

谢谢

在struct中导入c# StringBuilder结构中的C dll

要创建固定缓冲区,您不使用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, lppollppop是指针,所以它们应该创建为指针,或者创建为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方法定义不正确,应该是(假设CFSPICFS_PRINTINFO):

[DllImport("mydll.dll")]
internal static extern int CFTGetDefaultPrintInfo(string lptPrinterName, out CFSPI lpPrtInfo);