none
vs2010+WPF下调用C++Builder写的Dll中的函数导致堆栈溢出!有何良策? RRS feed

  • 问题

  • vs2008调用这个C++Builder写的Dll中的函数还是完全正常!

    据说是WPF的消息机制导致的问题,不知道各位大咖有和解决之道!?

             [DllImport("ZetaEncryption.dll", EntryPoint = "VerifySoftSN", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, SetLastError = true,ThrowOnUnmappableChar=true) ]
            static extern bool VerifySoftSN(string MacCode, string sn, string crc, string pubKey);

    2010中调用:

      

          public static bool ZetaVerifySoftSN(string MacCode, string sn, string crc)
            {
                int imcLen = 0, isnLen = 0;
                imcLen = MacCode.Length;
                isnLen = sn.Length;


                bool bRet = true;
                try
                {
                    ////////运行到下面这一句会导致
                    bRet = VerifySoftSN(MacCode, sn, crc, PUBKEY); 
                   // Thread thread = new Thread(() => { bRet = VerifySoftSN(MacCode, sn, crc, PUBKEY); });
                  //  thread.Start();
                  //  Thread.Sleep(1000);
                }
                catch (Exception e1)
                {
                    bRet = false;
                }
                return bRet;

            }

        每次只要运行到VerifySoftSN 这个函数就象进入了黑洞,程序就不动了,过一段时间后会弹出说 堆栈溢出

    因为这个dll文件我在C++Builder,Delphi 以及VS2008下使用均为正常,没有任何问题,所以排除是异常处理以及调用规则的问题!

    因为现在用c#编写 WPF的应用系统,才出现这种问题,不知道各位有何良策?(在不建议重写的情况下!!!哈哈)

    2013年9月10日 16:48

答案

  • static extern bool VerifySoftSN(string MacCode, string sn, string crc, string pubKey);

    我猜测你的这个函数的原型应该是:

    BOOL VerifySoftSN(const char * MacCode, const char* sn, const char* crc, const char* pubKey);

    在其实现内部,你可以通过 strlen(MacCode) 来得到 MacCode 的长度。

    堆栈溢出的话,很可能就是你使用的 string(unicode) 类型无法在被正确转换成多字节(CharSet.Ansi)空终止字符串 (char *)。

    你可以给 string 类型参数标记为 MarshalAs(UnmanagedType.LPTStr) 来修正。

    如果不行的话,你可以通过 Marshal.AllocHGlobal 来分配 MacCode.Length +1 (这只是伪码,你需要先转成 ANSI ,然后再得到 byte 数组大小然后加 1)的空间然后传递给你的 VerifySoftSN。或者用 Marshal.StringToHGlobalAnsi 来得到 MacCode 的 char * 类型,也可以在 byte 数组上通过 Marshal.UnsafeAddrOfPinnedArrayElement 来得到 char *。那么你的 VerifySoftSN 应该如下:

    static extern BOOL VerifySoftSN(IntPtr MacCode, IntPtr sn, IntPtr crc, IntPtr pubKey);

    2013年9月11日 2:04