2013-10-10 5 views
0

Структура, которую я построил в C# при запуске функции, не дает мне одного из сообщений об ошибке, которые говорят мне, что что-то не так с конструкцией. В нем говорится, что исходный файл не найден. Опять же, я мало знаю об этой DLL b/c из-за отсутствия документации. Но я все еще думаю, что это потому, что я неправильно настроил структуру. Скорее всего, я думаю о третьей структуре, где она ссылается на структуру внутри структуры. Я надеялся на некоторые отзывы о работе, которую я сделал. Спасибо за помощь.Другой PInvoke - сообщение об ошибке говорит, что источник не найден?

Это то, что было предусмотрено в C:

int BatchTotal_Transactions(int transType, pTGiftCardReqBatchTotal req, pTGiftCardRespBatchTotal resp, int (*Com)(char *)); 

typedef struct _tagGiftCardReqBatchTotal 
{ 
char Password[9]; 
char OperatorID[9]; 
char BatchNum[14]; 
char StartDate[11]; 
char EndDate[11]; 
unsigned char Type; 
} TGiftCardReqBatchTotal, *pTGiftCardReqBatchTotal; 


typedef struct _tagGiftCardRespBatchTotal 
{ 
char Result; 
char TerminalId[17]; 
unsigned char DispMsgControl; 
char DispMsg[256]; 
char Display[41]; 
char Date[11]; 
char Time[9]; 
char RespCode[4]; 
char BatchNum[14]; 
char ErrorFlag; 
char CustLang; 
char UserLang; 
char OpenDate[17]; 
char ClosedDate[17]; 
char StartDate[11]; 
char EndDate[11]; 
char BatchStatus; 
int CardTypeNum; 
TGiftCardTotals GctHost[MAX_CARD_CODES]; 
TGiftCardTotals GctTRS[MAX_CARD_CODES]; 
} TGiftCardRespBatchTotal, *pTGiftCardRespBatchTotal; 

typedef struct _tagGiftCardTotals 
{ 
unsigned short CardCode; 
unsigned short PurchaseNum; 
long PurchaseTotal; 
unsigned short RefundNum; 
long RefundTotal; 
unsigned short RedemptionNum; 
long RedemptionTotal; 
unsigned short CorrectionNum; 
long CorrectionTotal; 
long PurchaseBenefitTotal; 
long RefundBenefitTotal; 
long RedemptionBenefitTotal; 
} TGiftCardTotals, *pTGiftCardTotals; 

И это, как я сделал это в C#:

[DllImport("batch.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)] 
    public static extern int BatchTotal_Transactions(int transType, ref giftCardReqBatchTotal req, ref giftCardRespBatchTotal resp, IntPtr com); 


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public struct _tagGiftCardReqBatchTotal 
    { 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)] 
     public string Password; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)] 
     public string OperatorID; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] 
     public string BatchNum; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] 
     public string StartDate; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] 
     public string EndDate; 

     public byte Type; 
    } 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public struct _tagGiftCardRespBatchTotal 
    { 
     public byte Result; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)] 
     public string TerminalId; 

     public byte DispMsgControl; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 
     public string DispMsg; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 41)] 
     public string Display; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] 
     public string Date; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)] 
     public string Time; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
     public string RespCode; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] 
     public string BatchNum; 

     public byte ErrorFlag; 

     public byte CustLang; 

     public byte UserLang; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)] 
     public string OpenDate; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)] 
     public string ClosedDate; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] 
     public string StartDate; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] 
     public string EndDate; 

     public byte BatchStatus; 

     int CardTypeNum; 

     [MarshalAs(UnmanagedType.Struct, SizeConst = 1024)] 
     public _tagGiftCardTotals GctHost; 

     [MarshalAs(UnmanagedType.Struct, SizeConst = 1024)] 
     public _tagGiftCardTotals GctTRS; 
    } 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public struct _tagGiftCardTotals 
    { 
     public UInt16 CardCode; 

     public UInt16 PurchaseNum; 

     public int PurchaseTotal; 

     public UInt16 RefundNum; 

     public int RefundTotal; 

     public UInt16 RedemptionNum; 

     public int RedemptionTotal; 

     public UInt16 CorrectionNum; 

     public int CorrectionTotal; 

     public int PurchaseBenefitTotal; 

     public int RefundBenefitTotal; 

     public int RedemptionBenefitTotal; 
    } 
+0

Это не сообщение об ошибке PInvoke. Возможно, это сообщение отладчика. Цитирование * точного * сообщения и там, где вы его видите, существенно. Опубликовать снимок экрана. –

+0

http://tinypic.com/r/1z3qtrn/5 –

+0

Вот скриншот ошибки: http://tinypic.com/r/1z3qtrn/5 Это говорит файл находится в е: \ Teamcity ... Но здесь нет ссылки на «teamcity» на ноутбуке, но файл, который он ищет, определенно находится в связанной DLL-ссылке, которая не является частью DLL, которая связана со структурами выше. Единственная вещь, о которой я могу думать, это структура плохо сформирована и заставляет ее делать что-то напуганное. Почему независимая DLL, которую мы получили от одного вендера (с небольшой документацией), вызывает функцию от другого вендера? просто не имеет смысла. –

ответ

Смежные вопросы