代码之家  ›  专栏  ›  技术社区  ›  Julius A

将非托管C++代码转换为C语言

  •  3
  • Julius A  · 技术社区  · 16 年前

    任何有指针的工具/实用工具,用于将非托管C++转换为C? 我试过了 http://www.pinvoke.net/ 但是我找不到这个API的引用 AddUsersToEncryptedFile 关于这个 question .

    4 回复  |  直到 13 年前
        1
  •  2
  •   Ira Baxter    13 年前

    一般来说,这是 真的? 很难,因为C++比C语言提供了不同的特性: 模板、朋友、零终止字符串、非托管指针、COM等, 更不用说解析C++是一个工作的婊子了。

    要做到这一点,你需要一个完整的C++解析器,名称和类型解析,一组关于如何将每个构造(问题或不)转换成等价的C代码的想法,一种将这些思想编码成自动翻译步骤的方法,以及一个如何处理那些不能很好翻译的代码(通常是“手工修复”)的计划。

    使用 DMS Software Reengineering Toolkit 提供所有必要的机械, 我的公司,语义设计,实际上构建了这样一个工具,但从来没有使用它,对于一个大客户来说,想把C++的800 K SLoc移到C语言中。在项目进行的过程中,大约有2/3的时间,客户进行了一些鸟笼管理层的重组,新经理决定不着手节省资金(该工具本身做得很好)。

        2
  •  2
  •   Romain Verdier    16 年前

    你会发现这个故事很有趣:

    Disclosing How C#-SQLite Was Ported to .NET

    sqlite是一个C程序,但是这里有一些很好的高级提示。

        3
  •  1
  •   Mattias S    16 年前

    您只需要声明该API吗?有个工具叫 PInvoke Interop Assistant 你可以使用,但我个人更喜欢DIY方式。没那么难。

    尝试以下定义

    struct EFS_CERTIFICATE_BLOB
    {
        public int dwCertEncodingType;
        public int cbData;
        public IntPtr pbData;
    }
    
    struct ENCRYPTION_CERTIFICATE
    {
        public int cbTotalLength;
        public IntPtr pUserSid;
        public IntPtr pCertBlob;
    }
    
    struct ENCRYPTION_CERTIFICATE_LIST
    {
        public int nUsers;
        public IntPtr pUsers;
    }
    
    [DllImport("advapi32.dll", CharSet=CharSet.Unicode)]
    static extern uint AddUsersToEncryptedFile(string lpFileName, ref ENCRYPTION_CERTIFICATE_LIST pUsers);
    
        4
  •  1
  •   Alan    16 年前

    如果你将C++代码移植到C语言,那么你应该考虑把非托管C++代码转换成C++/CLI。然后,你可以在一个更可控的庄园里(即一次一块地——理想情况下,在你走的时候进行单元测试)开始进入C。

    转换为C++/CLI的另一种方法是使用现有的非托管C++代码包。 SWIG 但是,使用这种方法会使迁移变得更加困难。