C# как получить данные с DLL
От: nikolasx  
Дата: 17.11.09 09:29
Оценка:
Народ помогите пожайлуста, такая тема уже была, и подсказка там есть, но до меня что то не доходит, где и как нужно подправить что бы оно работало.

Такая вот проблема:
есть dll-ка в которой:


struct RetData {
int Count;
int CmdCode;
LPARAM UserData;
LPARAM Status;
LPSTR CmdName;
LPSTR SendStr;
LPSTR Whole;
LPSTR RetItem[20];
unsigned char OrigStat[6];
};

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 ??

Буду блогадарен если покажете исправленыый код.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.