1.获取本程序所在目录地址的函数:
GetCurrentDirectoryA()
char Add[MAX_PATH]; GetCurrentDirectoryA(MAX_PATH, Add);
如果想要得到路径中文件的绝对地址,可以用strcat拼接
//比如要获得main.dll的地址 char AddPlus[]="\\main.dll"; strcat(Add,AddPlus); cout<<"拼接好的地址为:"<<Add<<endl;
如果字符串是用string容器进行接收的,可以用string中的c_str()方法转换成char型字符数组
c_str():生成一个const char*指针,指向以空字符终止的数组。
string str="hello world!"; char getStr[12]; strcpy(getStr, str.c_str());
2.远线程注入了dll后,dll干完了事情后想删除自身,如果用FreeLibrary()直接释放,在 FreeLibrary之后,该DLL的地址空间就不再可用了,但这时 EIP 指针仍然会指向 FreeLibrary 的下面一句,于是程序崩溃。
还好,Win32 提供了另外的一个 API——FreeLibraryAndExitThread,这个函数能够在销毁 DLL 之后直接调用 ExitThread。
#include <Windows.h> HMODULE g_hDll = NULL; DWORD WINAPI UnloadProc(PVOID param) { MessageBox(NULL, TEXT("Press ok to unload me."), TEXT("MsgBox in dll"), MB_OK); FreeLibraryAndExitThread(g_hDll, 0); // oops! return 0; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, PVOID lpvReserved) { if (DLL_PROCESS_ATTACH == fdwReason) { g_hDll = (HMODULE)hinstDLL; HANDLE hThread = CreateThread(NULL, 0, UnloadProc, NULL, 0, NULL); CloseHandle(hThread); } return TRUE; }