मैं एक सी एपीआई (एक देशी विन डीएल) के लिए सी # पी/इनवोक रैपर लिखने की कोशिश कर रहा हूं, और आम तौर पर यह ठीक काम कर रहा है। एकमात्र अपवाद एक विशिष्ट विधि है जो सी कोड में पैरामीटर के रूप में एक संरचना लेता है। फ़ंक्शन को किसी भी अपवाद के बिना बुलाया जाता है, लेकिन यह झूठा रिटर्न देता है कि निष्पादन में कुछ विफल रहा है।सी # पी/संरचना की समस्या को शामिल करें
एपीआई हैडर शामिल विधि और structs फ़ाइल में निम्न प्रकार परिभाषित कर रहे हैं:
public const int MAX_ICE_MS_TRACK_LENGTH = 256;
[StructLayout(LayoutKind.Sequential)]
public class MSTrackData {
public UInt32 nLength;
public readonly Byte[] TrackData = new byte[MAX_ICE_MS_TRACK_LENGTH];
}
[DllImport("ICE_API.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool EncodeMagstripe(IntPtr hDC,
[In]ref MSTrackData pTrack1,
[In]ref MSTrackData pTrack2,
[In]ref MSTrackData pTrack3,
[In]ref MSTrackData reserved);
:
#define MAX_ICE_MS_TRACK_LENGTH 256
typedef struct tagTRACKDATA
{
UINT nLength;
BYTE TrackData[MAX_ICE_MS_TRACK_LENGTH];
} TRACKDATA, FAR* LPTRACKDATA;
typedef const LPTRACKDATA LPCTRACKDATA;
BOOL ICEAPI EncodeMagstripe(HDC /*hDC*/,
LPCTRACKDATA /*pTrack1*/,
LPCTRACKDATA /*pTrack2*/,
LPCTRACKDATA /*pTrack3*/,
LPCTRACKDATA /*reserved*/);
मैं/एक सी # पी बनाने के लिए निम्नलिखित कोड का उपयोग कर आवरण आह्वान के प्रयास किए हैं
CardApi.MSTrackData trackNull = null;
CardApi.MSTrackData track2 = new CardApi.TrackData();
byte[] trackBytes = Encoding.ASCII.GetBytes(";?");
track2.nLength = (uint)trackBytes.Length;
Buffer.BlockCopy(trackBytes, 0, track2.TrackData, 0, trackBytes.Length);
if (!CardApi.EncodeMagstripe(hDC, ref trackNull, ref track2, ref trackNull, ref trackNull)) {
throw new ApplicationException("EncodeMagstripe failed", Marshal.GetLastWin32Error());
}
गु:
तो मैं निम्नलिखित सी # कोड का उपयोग कर EncodeMagstripe विधि को लागू करने की कोशिश एप्लिकेशनएक्सप्शन को फेंकने का कारण बनता है, और त्रुटि कोड 801 है जो दस्तावेज़ीकरण के अनुसार है "डेटा में चयनित ट्रैक 2 प्रारूप के लिए बहुत से वर्ण शामिल हैं।"। हालांकि चयनित ट्रैक प्रारूप में 39 अक्षरों की अनुमति होनी चाहिए (मैंने छोटे तारों को भी आजमाया है)।
मुझे लगता है कि एमएसटीआरडीटा परिभाषा में मैंने कुछ गलत किया है, लेकिन मुझे यह नहीं पता कि यह क्या हो सकता है। क्या किसी के पास कोई सुझाव है?
ICEAPI WINAPI को संदर्भित करता है, इसलिए मैंने DllImport विशेषता में "कॉलिंग कन्वेंशन = कॉलिंग कन्वेंशन। विनापी" भी सेट किया है। आपके सुझाव को लागू करने के बाद, कॉल पूरी तरह से काम करता था :-) आपको बहुत बहुत धन्यवाद :-) –