int CALLBACK PrintDiagnosticInfo(HWND, void (CALLBACK far *), LPARAM);
эта функция помещает в структуру данные. структура передается параметром с помощью указателя на пользовательскую функцию. Я пишу:
using System;
using System.Runtime.InteropServices;
namespace FP3530Printer
{
public delegate void Result(ref RetData rtd);
[StructLayout(LayoutKind.Sequential)]
public class RetData
{
public int Count;
public int CmdCode;
public int UserData;
public int Status;
public string CmdName;
public string SendStr;
public string Whole;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]
public byte[] OrigStat;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.LPStr, SizeConst = 20)]
public String[] RetItem; // массив указателей на нуль терминированные строки,
// в которые помещается результат выполнения команды
}
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
public static void GetResult(RetData rtd)
{
Console.Write("{0}\n", rtd.CmdName);
}
[DllImport("FPL.dll")]
public static extern int PrintDiagnosticInfo(int hwd, Result res, long x);
[DllImport("FPL.dll")]
public static extern int InitFPport(int port, int speed);
[DllImport("FPL.dll")]
public static extern int CloseFPport();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
try
{
Result _res = new Result(GetResult);
int i = InitFPport(1, 19200);
PrintDiagnosticInfo(0, _res, 0L);
}
catch(Exception e)
{
Console.Write("Error: {0}\n",e.Message);
}
CloseFPport();
Console.Read();
}
}
}
выдается ошибка
"Can not marshal field RetItem of type FP3530Printer.RetData: This type can not be marshaled as a structure field."
Вопрос: как передать String[] RetItem ??
Буду блогадарен если покажете исправленыый код.
Re: C# как получить данные с DLL
От:
Аноним
Дата:
17.11.09 21:05
Оценка:
Здравствуйте, nikolasx, Вы писали:
а почему они местами поменяны? N>struct RetData { N>... N> LPSTR RetItem[20]; N> unsigned char OrigStat[6]; N> };
N>... N> public class RetData N> { N>... N> public string Whole; N> [MarshalAs(UnmanagedType.ByValArray, SizeConst=6)] N> public byte[] OrigStat;
N> [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.LPStr, SizeConst = 20)] N> public String[] RetItem; // массив указателей на нуль терминированные строки, N> // в которые помещается результат выполнения команды N> }
N>...
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, nikolasx, Вы писали:
А>а почему они местами поменяны? N>>struct RetData { N>>... А>N> LPSTR RetItem[20]; N>> unsigned char OrigStat[6]; N>> };
N>>... N>> public class RetData N>> { N>>... N>> public string Whole; А>N> [MarshalAs(UnmanagedType.ByValArray, SizeConst=6)] N>> public byte[] OrigStat;
N>> [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.LPStr, SizeConst = 20)] N>> public String[] RetItem; // массив указателей на нуль терминированные строки, N>> // в которые помещается результат выполнения команды N>> }
N>>...
Этот код скопирован с другой темы форума, как там ответели, то это просто так вырезали.