首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#调用C++写的dll的有关问题,也许对熟悉的人很简单,但是这个有关问题小弟我查了很多资料也没解决

2012-02-23 
C#调用C++写的dll的问题,也许对熟悉的人很简单,但是这个问题我查了很多资料也没解决c++中有这样的方法DWOR

C#调用C++写的dll的问题,也许对熟悉的人很简单,但是这个问题我查了很多资料也没解决
c++中   有这样的方法
DWORD   GetChallenge(IN   HANDLE   hContext,
                                          IN   WCHAR     *pszUserName,
                                          OUT   BYTE     **pChallenge,  
                                          OUT   DWORD   *dwcbChallenge);
C#中我用下面的方法使用
[DllImport( "cardmgr.DLL ",   SetLastError   =   true)]
                public   static   extern   uint   CMGetChallenge
                        (
                        IntPtr   hContext,
                        [MarshalAs(UnmanagedType.LPWStr)]   string   pwszUserName,
                        ref   byte[]   pbChallenge,
                        ref   int   cbChallenge);

但是在   程序中运行时获取的pbChallenge不正确,以下是调用代码
  uint   dwAcquireCardStatus   =   1;
                        uint   dwLockCardStatus   =   1;
                        uint   dwChangePinStatus   =   0;
                        IntPtr   hContext   =   new   IntPtr();
                        int   lenChallenge   =   16;
                        byte[]   challenge   =   new   byte[16];

                        dwAcquireCardStatus   =   CardMgrWrapper.CCAcquireSingleCard(ref   hContext);
                        if   (dwAcquireCardStatus   ==   0)
                        {
                                dwLockCardStatus   =   CardMgrWrapper.CCLockCard(hContext,   0);
                                if   (dwLockCardStatus   ==   0)
                                {
                                        dwChangePinStatus   =   CardMgrWrapper.CMGetChallenge2(hContext,
                                                                                                                          SCUserType.Admin,


                                                                                                                          ref   challenge,
                                                                                                                          ref   lenChallenge
                                                                                                                          );
                                }
                                else
                                {
                                        dwChangePinStatus   =   dwLockCardStatus;
                                }
                        }


调用后   challenge   得到的值不正确

请问   是不是我在DllImport后用C#写的参数不对?



[解决办法]
ref byte[] pbChallenge,//这里有问题 , c++ ** 是指向指针的指针它意思是要在dll开辟内存,不能用ref , try out



[解决办法]
直接把ref 或者 out去掉应该可以...byte[]在C#里面访问的时候应该就是用首地址,如果再指定ref的话......明白?

热点排行