요것과
(간단하게 dll 프로세스에 로드될때 웹브라우저 켜지는 dll 파일)
#include "stdafx.h"
#include <windows.h>
#define DEF_CMD "c:\\Program Files\\Internet Explorer\\iexplore.exe"
#define DEF_ADDR "
http://www.aegis-one.kr"
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) BOOL start()
{
char szCmd[MAX_PATH]= {0,};
STARTUPINFO si= {0,};
PROCESS_INFORMATION pi= {0,};
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
wsprintf(szCmd, "%s %s", DEF_CMD, DEF_ADDR);
if( !CreateProcess(NULL, (LPTSTR)(LPCTSTR)szCmd,
NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi) )
return FALSE;
if( pi.hProcess != NULL )
CloseHandle(pi.hProcess);
return TRUE;
}
#ifdef __cplusplus
}
#endif
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH :
start(); <------------------------- 이것과
break;
}
return TRUE;
}
--------------------------------------
이녀석
(프로세스에 로드가되면 이미지 파일을 다운로드하는 dll)
#include "stdafx.h"
#include "H_dll.h"
#include <urlmon.h>
#pragma comment(lib, "urlmon.lib")
DWORD WINAPI ThreadFunc(LPVOID lpParameter){
URLDownloadToFile(0, "
http://static.naver.com/www/u/2010/0611/nmms_215646753.gif", "C:\\a.gif", 0, NULL);
return 0;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
HANDLE hThread = NULL;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL); <--- 이곳의 차이점은??
CloseHandle(hThread);
break;
}
return TRUE;
}
둘다 기본적으로 DLL 파일이며 메모리에 로드(process attach) 되었을시에 함수를 호출하는데요.
맨위에 있는 코드의 경우에는 그냥 start(); 이렇게 곧바로 dll 메인에서 호출하고
아래에 있는 경우에는 createThread 함수로 새로운 쓰레드를 생성해서 ThreadFunc 함수를 호출하는데
그냥 ThreadFunc(); 이렇게 dll 메인에서 곧바로 호출하면 안되나요??
어떤분한테 물어보니 그냥 호출하면 메모리의 구조가 꺠진다고 말씀하시더군요.
꼭 CreateThread 함수를 이용하라고요.
대체 왜 그런걸까요?