可以初始化一个DLL文件 - 一个Dll构造函数

时间:2013-03-03 07:01:56

标签: c++ dll

我目前正在C#应用程序中以下列方式从我的dll导入一个函数。

[DllImport("C:\\File.dll")]
public static extern int SomeMethod(int A);

我的dll文件是用C ++编写的。此方法也在dll的.def文件中定义。 目前,无论何时在第一次尝试中调用此方法,都会调用其他几种方法,这些方法为此方法奠定了基础。但是这些方法只需要调用一次。这些方法永远不会被再次调用/我想知道是否有一种方法可以在加载dll文件时立即调用一组方法(初始化程序)。有什么作为DLL构造函数?

我的dllmain.cpp中有这样的东西可以在那里输入完成此任务的东西

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

1 个答案:

答案 0 :(得分:2)

DllMain最接近DLL“构造函数”(初始化的正确位置在DLL_PROCESS_ATTACH的case标签中)。但是,更实际的构造函数是由C#代码实例化的COM类。在这种情况下,将为您创建的类的每个实例调用构造函数(就像C#类一样)。在Visual C ++中创建一个ATL项目,它将为您生成这样的代码:

class ATL_NO_VTABLE CMyClass :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CMyClass, &CLSID_MyClass>,
    public IMyClass
{
public:
    CMyClass()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_MYCLASS1)


BEGIN_COM_MAP(CMyClass)
    COM_INTERFACE_ENTRY(IMyClass)
END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }

    ...

在CMyClass构造函数或FinalConstruct方法中,您可以执行对象的初始化代码。还要将SomeMethod方法添加到此类(以及IDL文件中的IDL接口)。

然后你会在C#中使用那个类:

MyClass mc = new MyClass(); // CMyClass::CMyClass and CMyClass::FinalConstruct are called in C++
mc.SomeMethod(); // CMyClass::SomeMethod is called in C++