我想写一个扑克牌游戏,先试着调用一下cards.dll里的函数。
代码如下:         [DllImport("cards.dll")]
        public static extern bool cdtInit(ref int width,ref int height);
        [DllImport("cards.dll")]
        public static extern bool cdtDrawExt(IntPtr hdc,int x,int y,int dx,int dy,int card,int        mode,long color);
        [DllImport("cards.dll")]
        public static extern bool cdtDraw(IntPtr hdc,int x,int y,int card,int mode,long color);
        
试着调用一下:                       
            cdtInit(ref a, ref b);
            cdtDraw(this.CreateGraphics().GetHdc(), 0, 0, 20, 0, 0);            cdtDrawExt(this.CreateGraphics().GetHdc(), 0, 0, 50, 50, 13, 0, 0);cdtDraw、cdtDrawExt则显示如下错误:
检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“WindowsApplication1!WindowsApplication1.Form1::cdtDraw”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
   请高手指点,谢谢!     

解决方案 »

  1.   

    天啦~~~~~~~~~
    我可能是没说清楚吧。
    cards.dll在 C:\WINDOWS\system32 里。windows 里扑克牌游戏都是用的这个dll
      

  2.   

    from
    http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=437using System;
    using System.Runtime.InteropServices;
    using System.Drawing;namespace cards
    {
        public class cardsdll
        {
            /// <summary>
            /// Initiates cards.
            /// </summary>
            /// <param name="width">no idea</param>
            /// <param name="height">no idea</param>
            /// <returns></returns>
            [DllImport("cards.dll")]
            private static extern bool cdtInit(ref int width, ref int height);        [DllImport("cards.dll")]
            private static extern void cdtTerm ();        /// <summary>
            /// Draws a card
            /// </summary>
            /// <param name="hdc">use Graphics.getHdc()</param>
            /// <param name="x">x location to draw card</param>
            /// <param name="y">y location to draw card</param>
            /// <param name="card">which card or card back to draw</param>
            /// <param name="type">0 draws front, 1 draws back</param>
            /// <param name="color">background for crosshatch back</param>
            /// <returns>dunno</returns>
            [DllImport("cards.dll")]
            private static extern bool cdtDraw (IntPtr hdc, int x, int y, int card, int type, long color);        /// <summary>
            /// Draws a card
            /// </summary>
            /// <param name="hdc">use Graphics.getHdc()</param>
            /// <param name="x">x location to draw card</param>
            /// <param name="y">y location to draw card</param>
            /// <param name="dx">width of card</param>
            /// <param name="dy">height of card</param>
            /// <param name="card">which card or card back to draw</param>
            /// <param name="type">0: front, 1: back, 2: hilite, 3: ghost, 4: remove, 5: invisible ghost, 6: X, 7: O</param>
            /// <param name="color">background for crosshatch back</param>
            /// <returns></returns>
            [DllImport("cards.dll")]
            private static extern bool cdtDrawExt (IntPtr hdc, int x, int y, int dx, int dy, int card, int suit, long color);        /// <summary>
            /// Animates card backs. Effects: blinking lights on robot, sun donning sunglasses, bats flying across the castle, and card sliding out of sleeve. Only for cards of normal size drawn with cdtDraw. 
            /// </summary>
            /// <param name="hdc">drawing context</param>
            /// <param name="cardback">which cardback</param>
            /// <param name="x">x location of card</param>
            /// <param name="y">x location of card</param>
            /// <param name="frame">frame of cardback.  Increment until function returns false.</param>
            /// <returns></returns>
            [DllImport("cards.dll")]
            private static extern bool cdtAnimate (IntPtr hdc, int cardback, int x, int y, int frame);
            
            public cardsdll()
            {
                int width = 71, height = 95;
                if (!cdtInit(ref width, ref height))
                    throw new Exception("could not load cards");
            }        public void Dispose()
            {
                cdtTerm();
            }        public bool drawanimatedcardback(IntPtr canvas, int x, int y, int design, int frame)
            {
                return cdtAnimate(canvas, design, x, y, frame);
            }
            public bool drawanimatedcardback(IntPtr canvas, Point p, int design, int frame)
            {
                return cdtAnimate(canvas, design, p.X, p.Y, frame);
            }
            
            public bool drawcardback(IntPtr canvas, int x, int y, int design)
            {
                return cdtDraw(canvas, x, y, design, 1, 0);
            }
            public bool drawcardback(IntPtr canvas, Point p, int design)
            {
                return cdtDraw(canvas, p.X, p.Y, design, 1, 0);
            }        public bool drawcard(IntPtr canvas, int x, int y, int card)
            {
                return cdtDraw(canvas, x, y, card, 0, 0);
            }
            public bool drawcard(IntPtr canvas, Point p, int card)
            {
                return cdtDraw(canvas, p.X, p.Y, card, 0, 0);
            }        public bool drawinvertedcard(IntPtr canvas, int x, int y, int card)
            {
                return cdtDraw(canvas, x, y, card, 2, 0);
            }
            public bool drawinvertedcard(IntPtr canvas, Point p, int card)
            {
                return cdtDraw(canvas, p.X, p.Y, card, 2, 0xffffff);
            }        public bool drawemptycard(IntPtr canvas, int x, int y, int background)
            {
                return cdtDraw(canvas, x, y, 1, 3, background);
            }
            public bool drawemptycard(IntPtr canvas, Point p, int background)
            {
                return cdtDraw(canvas, p.X, p.Y, 1, 6, background);
            }        /// <summary>
            /// Draws a card of the specified size
            /// </summary>
            /// <param name="canvas">hdc</param>
            /// <param name="p">origin</param>
            /// <param name="d">size</param>
            /// <param name="card">card</param>
            /// <returns></returns>
            public bool drawcard(IntPtr canvas, Point p, Size s, int card)
            {
                return cdtDrawExt(canvas, p.X, p.Y, s.Width, s.Height, card, 0, 0);
            }        /// <summary>
            /// Draws a card of a certain size
            /// </summary>
            /// <param name="canvas">hdc</param>
            /// <param name="x">origin x</param>
            /// <param name="y">origin y</param>
            /// <param name="dx">width</param>
            /// <param name="dy">height</param>
            /// <param name="card">card</param>
            /// <returns></returns>
            public bool drawcard(IntPtr canvas, int x, int y, int dx, int dy, int card)
            {
                return cdtDrawExt(canvas, x, y, dx, dy, card, 0, 0);
            }
        }}
     Here's code to use it.public enum suits : int

        CLUBS, DIAMONDS, HEARTS, SPADES 
    }
            
    public enum ranks : int 

        ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING 
    }private void draw (object sender, PaintEventArgs e)
    {
       cardsdll dll;
       IntPtr hdc = e.Graphics.GetHdc();
       dll.drawcard(hdc, x, y, ranks.FIVE*4+suits.CLUBS);
       e.Graphics.ReleaseHdc(hdc);

      

  3.   

    只需要将 private static extern bool cdtDrawExt (IntPtr hdc, int x, int y, int dx, int dy, int card, int suit, long color); 更改为 private static extern bool cdtDrawExt (IntPtr hdc, int x, int y, int dx, int dy, int card, int suit, int color); 就行了,我也遇到了这样的问题,只要将最后一个color的参数由long改为int就行了!