gpt4 book ai didi

c++ - dll文件是否可以初始化-A Dll constructor

转载 作者:行者123 更新时间:2023-11-28 03:21:53 26 4
gpt4 key购买 nike

我目前正在 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;
}

最佳答案

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 接口(interface))。

然后您可以像这样在 C# 中使用该类:

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

关于c++ - dll文件是否可以初始化-A Dll constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com