none
VS.Net Team System2008中的C#调用由BCB编写的Dll参数传递的问题 RRS feed

  • 常规讨论

  • 我用BCB写了一个DLL,在BCB中调用一点问题都没有,但是在C#中调用时出现问题,表现为C#中使用string类型的参数--》C++的char* 类型的参数传递值时出现问题,比如我在C#中传递“123456”,到Dll中就变为“1”,也就是说只取了第一个字符,而不是字符串,详细情况如下:

    BCB中:

    extern "C" __declspec(dllexport)   char* WINAPI  ZetaEncrypt(char* srcStr);

      char* WINAPI  ZetaEncrypt(char* srcStr)
    {
        __int64 nPwd;
        int ilen=strlen(srcStr);
        if(ilen==0)
            return "";

        nPwd=epass();
        char *cpass;
        cpass=new char[ilen+1];
        memset(cpass,'0',ilen);
        strcpy(cpass,srcStr);
        for(int j=0;j<ilen;j++)
        {
         cpass[j] ^= nPwd;
         }
        AnsiString strTemp=AnsiString(cpass);
        delete []cpass;
        return strTemp.c_str();
    }

    C#中:

          [DllImport("ZetaEncryption.dll", EntryPoint = "ZetaEncrypt", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
            static extern String ZetaEncrypt(String srcStr);

            private void button3_Click(object sender, EventArgs e)
            {
                String s="";
                s = textBox1.Text; //  这里是一个编辑框 ,这里赋值“123456”
                int ilen = s.Length;
              
                textBox2.Text = ZetaEncrypt(/*textBox1.Text*/"123456");//为了找问题,我硬编码了“123456”
          
            }

    说明:当执行 button3_Click时,查看传入的字符串值,是“123456”,进入到Dll的ZetaEncrypt函数体中,再看传入的字符串,已经变为“1”,而且我在其中使用 strlen()看其长度,为1!

    这样问题就是 c#中 string 到 dll中只取得第一个字符,而不是字符串!

    而这个dll如果用BCB来调用的话,就没有任何问题!

    请高手不吝赐教!

     

     

     


    “这不是我的错”,这句话不对。“这都是你的错”,这句话更不对。如果你没有犯过任何错误,就说明你可能没有努力去工作。
    2010年9月10日 8:14