用C++编写的dll工程如何插入.def文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C++编写的dll工程如何插入.def文件?相关的知识,希望对你有一定的参考价值。

麻烦说详细些,谢谢。

你可以参考别人或者自动生成的def文件自己编写,然后在项目属性的linker->Module Defination File 中设置这个文件

sample:

; test.def : Declares the module parameters.

LIBRARY "test.dll"

EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObject PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
参考技术A 你直接在头文件里把函数声明 前加上 __declspec就行了,不需要.def文件
__declspec BOOL Function_Name();

如果要使写的dll文件c和c++都能用,就得防止c++编译器对函数名进行重整

#ifdef __cplusplus Function_Name();
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT BOOL
参考技术B 你直接在头文件里把函数声明 前加上 __declspec就行了,不需要.def文件
__declspec BOOL Function_Name();

如果要使写的dll文件c和c++都能用,就得防止c++编译器对函数名进行重整

#ifdef __cplusplus Function_Name();
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT BOOL
参考技术C 直接写个文本文件,命名为*.def

然后编写,要导出的函数,变量 相关的表格
在VC中直接选文本文件,也可以选.cpp,.h 另存为文本文件 *.def

如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]

【中文标题】如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]【英文标题】:How to call dll file created with c# from c++ project? [duplicate] 【发布时间】:2015-07-16 05:09:49 【问题描述】:

我有一个用 c# 语言创建的 dll 文件。我想在 c++ 项目的 dll 文件中使用用 c# 语言编写的函数。 我知道可以将 c# dll 与 c# 项目一起使用。但不知道在 c++ 项目中执行 c# dll 的最佳方法是什么。我正在使用 Visual Studio 2013。非常感谢您的所有指导。

【问题讨论】:

您可以使用 C++/CLI 代替 C++,也可以创建一个 C# COM 对象并在 C++ 中使用它。两种方式……都不完美。 @对该问题投反对票的人:如果您知道,请分享您的知识,而不要仅仅对其他问题投反对票。 ***.com/q/19144006/2706918 使用 COM 互操作性非常容易。见msdn.microsoft.com/en-us/library/zsfww439(v=vs.80).aspx @AlexeiLevenkov 你认为 那个(以及 C++ 中 COM 的痛苦)实际上是 OP(在 Google 上找不到这个答案)会接受的“非常容易“? 【参考方案1】:

我将总结通过 COM 将 C# 类公开给 C++ 的基本步骤。假设您有以下 C# 类:

public class Number

    public Number()
    
    

    public int Value
    
        get;
        set;
    

首先您需要为要实现的类创建一个接口。只有通过该接口公开的方法和属性对 COM(以及 C++)可见。通常,此接口与类同名,但带有“I”前缀:

public interface INumber

    int Value
    
        get;
        set;
    

接下来,您需要将 ComVisible 和 Guid 属性添加到接口和类中。还建议在类中添加 [ClassInterface(ClassInterfaceType.None)]:

[ComVisible(true)]
[Guid("71CACDF6-B6CD-4A46-B951-02E5C542852C")]
public interface INumber

    ...

[ComVisible(true)]
[Guid("B5809A32-A066-42E3-96D7-09FE622BC994")]
[ClassInterface(ClassInterfaceType.None)]
public class Number : INumber

    ...

(我使用 Visual Studio 附带的 GUID 实用程序获得了 GUID。您可以在 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools 找到它)

这就是 C# 方面的内容。生成 C# DLL 后,您需要使用 Regasm.exe 命令行实用程序将其注册到 COM。启动命令提示符并键入以下命令:

“C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32”

Regasm ExampleDLL.dll /codebase /tlb

(如果你的VS安装路径不同,可能需要修改第一个。)

现在您可以像这样使用 C++ 中的 DLL:

#include <iostream>
#import "ExampleDLL.tlb" // This is a file that should have been generated by Regasm.exe

using namespace std;
using namespace ExampleDLL;

int main()

    CoInitialize(NULL);

    INumberPtr pNumber;
    pNumber.CreateInstace(__uuidof(Number));
    pNumber->Value = 5;
    cout << pNumber->Value;

    return 0;

更多详情请见Exposing .NET Framework Components to COM。

【讨论】:

感谢您的回答。您能说出 [Guid("71CACDF6-B6CD-4A46-B951-02E5C542852C")] 部分的用途吗?这只是一个 id 值吗? 我们是否应该将生成的 .tlb 文件添加到项目属性中? 是的,GUID 代表全局唯一标识符。 COM 中的每个类和接口都有一个与之关联的 GUID。您可以使用位于 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\guidgen.exe 的实用程序创建新的 GUID。 至于.tlb文件,不,你不需要将它添加到项目属性中。 好的,谢谢。另一个问题是我们应该将 dll 文件或 tlb 文件添加到项目属性中还是只使用 #import 就足够了?

以上是关于用C++编写的dll工程如何插入.def文件?的主要内容,如果未能解决你的问题,请参考以下文章

dll文件如何反汇编成源码,C++语言编写

LabVIEW如何方便地调用DLL文件

如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]

VS2013编写了个c++的dll动态库,怎么填写文件说明,版本,版权这些信息

如何用VC编写dll文件

导出 DLL C++ 类,关于 .def 文件的问题