0

我编写了以下 C++代码来创建win 32 Dynamic link library

#include <windows.h>
#include <some.h>

unsigned char  m_KSN[10];
unsigned char m_inintial_key[16];
unsigned char initial_key[16];

extern "C" __declspec(dllexport) unsigned char* OnDecryption(LPCTSTR stringKSN, 
    LPCTSTR BDK){
        for( i=0;i<10;i++){
            m_KSN[i]=asctohex(stringKSN[2*i],stringKSN[2*i+1]); } 
        for( i=0;i<16;i++){
    m_inintial_key[i]=asctohex(BDK[2*i],BDK[2*i+1]);}
       GetInitalKey(m_KSN, m_inintial_key, initial_key);
       // GetInitialKey function written in `.lib` file. Data type of (Byte*a Byte*    b Byte* c) 
   return initial_key;
  }

C#我的代码在哪里:

static class DecryptionDll
{
  public String BDK = "0111111119ABCDEFFEDCBA9877777777";
  public String KSN = "62994900380000C00329";

  internal static class UnsafeNativeMethods
    {   
        const string _dllLocation = "finalTest.dll";
        [DllImport(_dllLocation)]
        public static extern byte OnDecryption(string ksn, String bdk);
     }
}

我将dll文件放在当前目录中,我通过以下命令得到:

String path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.
GetExecutingAssembly().Location);

它向我显示my debug文件夹是当前路径。所以我把它dll放在那里。我也收到了很多帖子,但无法理解PInvoke情况。请帮我..

请告诉我我应该做些什么更改c++c#代码来调用编写的方法dll

我对这么多的编辑感到非常抱歉。这是因为我的连接速度慢

4

1 回答 1

0

您的 C++ 函数被声明为返回指向 unsigned char 数据的指针,但从不返回任何内容。令人惊讶的是它可以编译;鉴于该声明以及没有“return”语句的事实,您似乎应该从 C++ 编译器中得到一个错误。

我猜你的意思是返回 m_KSN 的地址,但是那个变量是在哪里声明的呢?从命名上看,它看起来像一个成员变量,但该函数似乎不是一个成员函数。

编辑后,事情仍然没有排成一行。名称中有很多带有 m_ 的变量,表示它们是成员变量。但是没有类存在,我们也看不到这些变量的声明。

在 C# 中,你声明你的函数返回一个字节。您正在从 C++ 返回指向一个字节的指针,这通常意味着您想要返回整个字节数组。你的 C# 声明应该更像这样吗?

public static extern byte [] OnDecryption(string ksn, String bdk);

您的 C++ 代码假定传递的字符串的长度并且从不测试它们。您可能会遇到一个空字符串,或者比您想象的更短(或更长)的字符串。或者一个没有有效十六进制字符的字符串。

您能否与我们分享为什么您特别相信您的“功能不平衡堆栈”?你的意思是你的功能是什么?

我看到您进行了一些进一步的编辑,这解决了您之前使用的数组背后的谜团m_——尽管您对同一个m_initial_key变量有两个声明。是m_ninitial_key故意不同m_inintial_key还是错字?

但其他担忧和问题仍然存在。我想还有一个问题是关于GetInitialKey()函数的。它不是一个众所周知的 Windows 函数,所以如果没有它的源代码,我们无法猜测它的作用;也许它期望的参数与您传递的参数不同,这实际上是导致问题的原因。

因为你想返回一个指向 unsigned char array 的指针,你可以使用 IntPtr 来完成。在 C# 中重新获取 IntPtr 后,使用该Marshal.Copy函数将数据从中复制到byte []数组中。这一切看起来像这样:

    internal static class UnsafeNativeMethods
    {
        const string _dllLocation = "..\\..\\..\\FinalTest\\debug\\finalTest.dll";
        [DllImport(_dllLocation, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
        public static extern IntPtr OnDecryption(string ksn, String bdk );

        static public byte[] OnDecryptionWrapper(string ksn, string bdk)
        {
            byte[] data = new byte[10];
            IntPtr ptr = OnDecryption(ksn, bdk);

            Marshal.Copy(ptr, data, 0, 10);
            return data;
        }
    }
于 2012-12-20T17:52:16.993 回答