C#调用VC的dll时报
对 PInvoke 函数“WindowsApplication1!WindowsApplication1.ClsIni::AddCustomPaper”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
大哥们,还有一篇贴在后面没人理,这里问题解决了,那边100分一起给。
快来救人啊,快死人了。求求你们了。

解决方案 »

  1.   

    DllImport中加上CallingConvention=CallingConvention.Cdecl试试
      

  2.   

    一样的。不是这样啊,应该是
            [DllImport("PrintCtrl.dll", CallingConvention = CallingConvention.Cdecl)]
            private static extern Boolean AddCustomPaper(
    [MarshalAs(UnmanagedType.LPStr)]ref string Printer,
    [MarshalAs(UnmanagedType.LPStr)]ref string PaperName,
    [MarshalAs(UnmanagedType.I8)]long width,
    [MarshalAs(UnmanagedType.I8)]long height,
    [MarshalAs(UnmanagedType.I8)]long left,
    [MarshalAs(UnmanagedType.I8)]long right,
    [MarshalAs(UnmanagedType.I8)]long top,
    [MarshalAs(UnmanagedType.I8)]long bottom
     );
    应该是要加上MarshalAs(UnmanagedType.I8)]这些个东西吧。是什么意思呢。
    望指点
      

  3.   

    那就不是很清楚了
    不过这里
    [MarshalAs(UnmanagedType.LPStr)]ref string Printer,
    [MarshalAs(UnmanagedType.LPStr)]ref string PaperName,
    [MarshalAs(UnmanagedType.LPStr)]string Printer,
    [MarshalAs(UnmanagedType.LPStr)]string PaperName,
    试试
      

  4.   

    我好象从来没用过
    [MarshalAs(UnmanagedType.LPStr)]
    ......
      

  5.   

    可能是直接覆盖DLL升级,引起版本问题。
      

  6.   

    如果没有可变参数的话
    我想应该是这样的吧,或者不写
    CallingConvention = CallingConvention.StdCall
      

  7.   

    dll 函数 c的声明贴出来?
      

  8.   

    [DllImport("PrintCtrl.dll")]
            private static extern Boolean AddCustomPaper(
            [In,Out,MarshalAs(UnmanagedType.AnsiBStr)]ref string Printer,
            [In,Out,MarshalAs(UnmanagedType.AnsiBStr)]ref string PaperName,
            [In,MarshalAs(UnmanagedType.I8)]long width,
            [In, MarshalAs(UnmanagedType.I8)]long height,
            [In, MarshalAs(UnmanagedType.I8)]long left,
            [In, MarshalAs(UnmanagedType.I8)]long right,
            [In, MarshalAs(UnmanagedType.I8)]long top,
            [In, MarshalAs(UnmanagedType.I8)]long bottom
            );
            
            public bool test( ref string printer ,ref string paperName)
            {
                long w, h, l, r, t, b;            w = 2000;
                h = 1500;
                l = 10;
                r = 10;
                t = 20;
                b = 20;            bool rb = AddCustomPaper(ref printer, ref paperName, w,h,l,r,t,b);
                if (rb)
                {
                    MessageBox.Show("that is ok");
                }
                else
                {
                    MessageBox.Show("Error");
                }
                return rb;
            }
    看看我哪错了吧。
      

  9.   

    c的 dll 原型
    不是c#的
      

  10.   

    extern "C" BOOL PASCAL EXPORT AddCustomPaper(LPTSTR szPrinterName, LPTSTR szPaperName, long nWidth, long nHeight, long nLeft, long nRight, long nTop, long nBottom)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    // normal function body here
    CPrinter p;
    SIZE s;
    RECT r;
    s.cx = nWidth;
    s.cy = nHeight;
    r.left = nLeft;
    r.right = nRight;
    r.top = nTop;
    r.bottom = nTop;
    return p.AddCustomPaper(szPrinterName, szPaperName, s, r);

    }BOOL CPrinter::AddCustomPaper(LPTSTR szPrinterName, PAPERNAME szPaperName, SIZE PaperSize, RECT rcPrintableMargin)
    {
        BOOL bOk = FALSE;
        if (IsWindowsNT()) //Windows NT4/2000/XP才支持
        {
            FORM_INFO_1 fi1;
            fi1.Flags = FORM_USER;
            fi1.pName = (LPTSTR)szPaperName;
            fi1.Size.cx = PaperSize.cx * 100;
            fi1.Size.cy = PaperSize.cy * 100;
            fi1.ImageableArea.left = rcPrintableMargin.left * 100;
            fi1.ImageableArea.top = rcPrintableMargin.top * 100;
            fi1.ImageableArea.right = fi1.Size.cx - rcPrintableMargin.right * 100;
            fi1.ImageableArea.bottom = fi1.Size.cy - rcPrintableMargin.bottom * 100;
            HANDLE hPrinter = GetPrinterHandle(szPrinterName);
            if (hPrinter)
            {
                bOk = (SetForm(hPrinter, (LPSTR)szPaperName, 1, (LPBYTE)&fi1) || //已存在该类型纸张则更改
                       AddForm(hPrinter, 1, (LPBYTE)&fi1)); //否则添加此自定义纸张
                ClosePrinter(hPrinter);
            }
        }
        return bOk;
    }
    这是相关的两个方法。
      

  11.   

    大哥你给改好行吗?还有[MarshalAs]里是不是要指名是In 还是Out呢,我现在不出错了,可是取不出来东西。返回一直是false
      

  12.   

    VC 里long & nPrintNameBufferLen 
    long &是什么类型??郁闷啊。。
      

  13.   

    可能是传入的参数不对,c#中的int型对应c++的Long型
      

  14.   

    不懂C#,根据你的错误信息猜的。可能是你对DLL里的函数调用规则不跟DLL中函数的声明一致,比如说却少了参数,或者参数类型不匹配etc.
      

  15.   

    一般来说VC中的LONG=4BYTE,INT=4BYTE,LONG &(引用类型)=4BYTE,LONG *=4BYTE.
      

  16.   

    吃饭都吃不舒服,都两天了还没出来东西。郁闷啊
    现在可以调用到VC里的方法,但是出来的东西全为false郁闷,超级。
      

  17.   

    给一个变量初使化的时候分配一个内存空间
    请问要如何写呢
    就像PB里的string printerlist = space(512)一样,
    请各位大哥来帮帮。好可怜啊,什么东西都没解决好,到处出问题
      

  18.   

    做c++的DLL 调用前 先在网上搜一份 C++和C#的数据类型对照表 我上次 调用delphi的DLL 才叫死人呢
      

  19.   

    是不是VC里的string在C#里不能用string来传收呢?
      

  20.   

    哇,C语言撒
    我从A学到B,快到C了.
      

  21.   

    我感觉问题出自没有正确的Marshal上。给你个我现在项目中实际的例子(注意String等的Marshal类型一定要合适才行。在我的工程当中,C++的DLL里面,command参数用的是BSTR,所以在C#中,我把String参数Marshal成了UnmanagedType.BStr,这样调用C++ DLL的时候,C++代买才能得到正确的数据):
    1. C#中的调用代码
       [DllImport("xxx.dll")]
       public static extern  uint IoControlBOOL(uint uiHandle, 
         [MarshalAs(UnmanagedType.BStr)]string strCommand, 
         [MarshalAs(UnmanagedType.Bool)]ref bool VARIANT_BOOL);
    2. DLL中的代码(C++的)
       EXPORT_API HRESULT IoControlBOOL(UINT uiHandle,
         BSTR Command, 
         bool *pArgument);
      

  22.   

    你用Int32试一试凡是C中涉及引用的在C#中尝试ref
      

  23.   

    调用COM的时候, .net 会负责类型转换的吧, 参考 c# programming com+