【问题标题】:Start Application within a DLL在 DLL 中启动应用程序
【发布时间】:2012-06-07 12:13:36
【问题描述】:

所以我想创建一个包含应用程序的 Dll。我的代码:

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch(ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            StartApp();
            break;
    }

    return TRUE;
}

还有 StartApp 功能:

void StartApp()
{   
    //some declartions
    iPtr->Start();
}

问题是函数 Start() 在连续循环中运行(比如 while(true)),我认为这是导致 dll 永远不会中断并返回 true 的问题。我试图在不同的线程中运行它,但这不起作用。

所以我的问题是如何使用 dll?

如果 DllMain 没有完成并且不返回 TRUE 是否有问题?

【问题讨论】:

  • >> 我想创建一个包含应用程序的 Dll 通常需要一个 exe 来启动应用程序。 DLL 无法单独完成。那么,谁在加载这个 DLL?
  • @Unni 所以我想制作一个可以加载 dll 的 c++ 应用程序,而 dll 将加载另一个应用程序
  • 你的意思是你的DLL会启动另一个.exe?那么 while(true) 循环的问题在哪里呢?启动exe后,StartApp()函数就退出了,对吧?
  • @Unni 所以我的主程序启动了这个 DLL(1)。 DLL(1) 应该调用位于 DLL(2) 中的函数。来自 DLL(2) 的函数具有 while(true) 循环。所以我的 DLL(1) 没有返回任何东西,因为 DLL(2) 函数永远不会完成。
  • @Thanatos 根据您的 cmets,我认为两个不同的应用程序,一个在 c++ 中,另一个在 c# 中,带有一些进程间通信是一个更可行的解决方案

标签: c++ winapi dll


【解决方案1】:

是的,有一个问题是 DllMain 没有返回,正如文档所述:

When a DLL entry-point function is called because a process is loading, the function returns TRUE to indicate success. For processes using load-time linking, a return value of FALSE causes the process initialization to fail and the process terminates. For processes using run-time linking, a return value of FALSE causes the LoadLibrary or LoadLibraryEx function to return NULL, indicating failure. (The system immediately calls your entry-point function with DLL_PROCESS_DETACH and unloads the DLL.) The return value of the entry-point function is disregarded when the function is called for any other reason.

Source.

您可以为 StartApp 函数创建一个包装函数,并通过您的 dll 公开它。之后,您可以从可执行文件中调用导出的 StartApp 函数(在加载 dll 之后)。确保从不同的线程调用它,因为它会阻塞。

【讨论】:

  • Cum am zis mai sus nu pot sa creez un nou thread pentru ca aplicatia nu il baga in seama trece pur si simplu mai leavee (am un singur procesor) si aplicatia nu functioneaza, am incercat sa il astept cu WaitForSingleObject dar degeaba
  • 让我们保持英文。也许其他一些人需要这些信息。正如 Hans Passant 在他的评论中所说,如果 CreateThread 不返回 false,它应该可以工作。你能发布更多信息吗?是否甚至调用了线程函数(您可以添加一些跟踪)?您可以为 StartApp 函数添加一些代码吗?您是否使用 CREATE_SUSPENDED 选项调用 CreateThread?使用你的调试技能。
  • 我无法使用“我的调试技能”,因为我使用的是 Interop。我有一个从 c++ 调用的 C# dll,并且存在问题。如果我从 c# 运行 c++ dll,它可以工作,但是当我从 c++ 调用它时,它有时工作/有时不工作。如果我通过手动运行它,它不起作用,但如果我使用调试器它可以工作
  • 非确定性行为可能是由竞争条件引起的。请检查您的线程。可以贴一些代码吗?否则我只是在这里猜测......
  • 我已经解决了:我没有将 DLL 加载到 switch 块中,而是将 StartApp 放在了 extern C 块中。我现在要做的就是加载 dll 并使用 GetProcAddress 找到它并运行它。虽然当我说它评论nr。 3 这是因为 VS 6.0 以某种方式使用该程序并将其与正常项目链接。由于需要依赖,当我手动进行时它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多