2012-06-02 3 views
0

Итак, я хочу создать Dll, содержащую приложение. Мой код:Запуск приложения в 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() работает в непрерывном цикле (СТГ, как в то время (правда)), и я думаю, что это проблема в том, что dll никогда не ломается и возвращает true. Я попытался запустить его в другом потоке, но это не работает.

Итак, мой вопрос в том, что я могу сделать, чтобы использовать dll?

Есть ли проблема, если DllMain не завершает работу и не возвращает TRUE?

+0

>> Я хочу создать Dll, содержащую приложение Обычно для запуска приложения обычно требуется exe. DLL не может сделать это в одиночку. Итак, кто загружает эту DLL? – PermanentGuest

+0

другое приложение C++ – Thanatos

+0

@Unni Итак, я хочу создать приложение C++, которое будет загружать dll, и DLL загрузит другое приложение. – Thanatos

ответ

0

Да, есть проблема в том, 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). Убедитесь, что вы вызываете его из другого потока, поскольку он будет блокироваться.

+0

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 Departeor (am un singur procesor) si aplicatia nu functioneaza, am incercat sa il astept cu WaitForSingleObject dar degeaba – Thanatos

+0

Давайте держать его на английском языке. Возможно, некоторым людям нужна эта информация. Как говорит Ханс Пассант в своем комментарии, если CreateThread не возвращает false, он должен работать. Можете ли вы разместить дополнительную информацию? Является ли функция потока даже вызвана (вы можете добавить некоторые следы)? Можете ли вы добавить код для функции StartApp? Вы вызываете CreateThread с параметром CREATE_SUSPENDED? Используйте навыки отладки yout. –

+0

Я не могу использовать «мои навыки отладки», так как я использую Interop. У меня есть C# dll, который вызывает вызов C++, и есть проблема. Если я запускаю dll C++ из C#, это работает, но когда я вызываю его из C++, он иногда работает/иногда нет. Если я запустил его, перейдя на него вручную, он не работает, но если я использую отладчик, то он работает – Thanatos

Смежные вопросы