Java教程

记录几个小技巧和函数

本文主要是介绍记录几个小技巧和函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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;  
    }  

这篇关于记录几个小技巧和函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!