【问题标题】:DllMain entry point DLL_PROCESS_DETACHDllMain 入口点 DLL_PROCESS_DETACH
【发布时间】:2016-12-30 06:45:39
【问题描述】:

我有一个 c++ dll,从 c# 进程调用...

[DllImport(@"My.dll", EntryPoint = "Function1", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool MyFunction(int id1, int id2, [MarshalAsAttribute(UnmanagedType.LPWStr)] StringBuilder Name);

这里是 dll 入口点...

switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        std::cout << "Attach" << std::endl;
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        std::cout << "Detach" << std::endl;
        break;
    }

我得到一个附加和四个分离像这样......

附加 分离 分离 分离 分离

谁能解释一下原因?

进程只调用一次函数。

【问题讨论】:

  • 为什么我的问题是-1?

标签: c# c++ dllmain


【解决方案1】:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
    std::cout << "Detach" << std::endl;
    break;

DLL_THREAD_ATTACHDLL_THREAD_DETACHDLL_PROCESS_DETACH 被触发时,您的代码将在控制台中写入“分离”。如果你只想要DLL_PROCESS_DETACHswitch 中添加break 语句:

switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
    std::cout << "Attach" << std::endl;
    break;
case DLL_THREAD_ATTACH:
    break;
case DLL_THREAD_DETACH:
    break;
case DLL_PROCESS_DETACH:
    std::cout << "Detach" << std::endl;
    break;
}

或者干脆省略未使用的情况。

【讨论】:

  • 完美。谢谢你。解决了。​​
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多