vlc中使用到的windows api

1. SetErrorMode:

  原型:

 UINT WINAPI SetErrorMode( _In_ UINT uMode);

  功能:

    控制指定类型的严重错误是由windows处理还是由应用程序处理。

  参数:

   uMode:

参数值 含义
0 使用系统默认的,既显示所有错误的对话框
SEM_FAILCRITICALERRORS
0x0001
系统不显示关键错误处理消息框。 相反,系统发送错误给调用进程。
SEM_NOALIGNMENTFAULTEXCEPT
0x0004
系统会自动修复故障此功能只支持部分处理器架构。
SEM_NOGPFAULTERRORBOX
0x0002
系统不显示Windows错误报告对话框。
SEM_NOOPENFILEERRORBOX
0x8000
当无法找到文件时不弹出错误对话框。 相反,错误返回给调用进程。


 返回值:错误模式的先前的状态

 备注:默认情况下,子进程继承父进程的错误模式标志


2. HeapSetInformation:

  原型:

BOOL WINAPI HeapSetInformation(
  _In_opt_  HANDLE HeapHandle,
  _In_      HEAP_INFORMATION_CLASS HeapInformationClass,
  _In_      PVOID HeapInformation,
  _In_      SIZE_T HeapInformationLength
);
  功能: 为某个堆使能堆特性。

  参数:

    HeapHandle: 堆句柄,为HeapCreate或GetProcessHeap函数的返回值;

    HeapInformationClass: 将被设置的特性值;最重要的值是HeapEnableTerminationOnCorruption,表示使能堆被破坏则程序中止特性;

    ...

  示例:

HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
  备注: 强烈推荐在程序中使能 HeapEnableTerminationOnCorruption


3. 显式加载动态库函数示例

    HINSTANCE h_Kernel32 = LoadLibrary("kernel32.dll");
    if(h_Kernel32)
    {
        BOOL (WINAPI * mySetDllDirectoryA)(const char* lpPathName);

        mySetDllDirectoryA = (BOOL WINAPI (*)(const char*))GetProcAddress(h_Kernel32, "SetDllDirectoryA");
        if(mySetDllDirectoryA) mySetDllDirectoryA("");

        FreeLibrary(h_Kernel32);
    }
  备注:

    1.  LoadLibrary的参数可带路径,但路径必须使用'\',如果不带路径,则会在默认搜索路径搜索该dll,默认搜索路径参考SetDllDirectory备注3;

    2. 若进程是第一次加载某个dll,则LoadLibrary将使用DLL_PROCESS_ATTACH调用该dll的DllMain()函数,如果DllMain返回FALSE,则LoadLibrary将卸载该dll并返回NULL;

   3.  BOOL WINAPI SetDllDirectory(_In_opt_  LPCTSTR lpPathName):

        功能:将lpPathName添加到dll搜索路径,若该参数为"",则将当前路径从dll默认搜索路径中删除;若该参数为NULL,则函数还原默认搜索搜索路径;

        dll默认搜索路径:

           1. 当前程序路径;

           2. 由lpPathName指定的路径;

           3. 系统路径;(GetSystemDirectory函数可获取)

           4. 16位系统路径,即System路径;

           5. Windows路径;(GetWindowsDirectory函数可获取)

           6. PATH所指定的路径。

      若需要添加多余一个的路径,需要使用AddDllDirectory函数。

4. SetProcessDEPPolicy

  原型:

BOOL WINAPI SetProcessDEPPolicy(_In_  DWORD dwFlags);
  功能: 设置数据执行保护策略(DEP,Data Execution Prevention)。类似于读/写/执行权限控制。

  参数:

   dwFlags: 0: 禁止DEP;

                     1:使能DEP。

5. 命令行参数读取示例

#pragma comment( linker, "/subsystem:\"console\" /entry:\"WinMainCRTStartup\"")

#include <windows.h>
#include <stdio.h>


static char *FromWide(const wchar_t *wide)
{
    size_t len;
    len = WideCharToMultiByte(CP_UTF8, 0, wide, -1, NULL, 0, NULL, NULL);

    char *out = (char *)malloc(len);
    if (out)
        WideCharToMultiByte(CP_UTF8, 0, wide, -1, out, len, NULL, NULL);
    return out;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nShowCmd)
{
    int argc;
    
    printf("%s\n", lpCmdLine);  // lpCmdLine是所有命令行参数组成的一个字符串

    // CommandLineToArgvW返回和标准c类似的wargv,参数个数保存在argc中,注意,使用完之后,wargv需要调用LocalFree释放
    wchar_t **wargv = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (wargv == NULL) return 1;

    for (int i = 0; i < argc; i++) wprintf(L"%s\n", wargv[i]);

    char **argv = (char**)malloc(sizeof(char*)*argc);
    if (argv == NULL)   return 1;

    for (int i = 0; i < argc; i++)  argv[i] = FromWide(wargv[i]);
    for (int i = 0; i < argc; i++)  printf("%s\n", argv[i]);
    for (int i = 0; i < argc; i++)  free(argv[i]);
    free(argv);

    LocalFree(wargv);

    system("pause");
    return 0;
}
  备注:

  1.  GetCommandLine: 该函数返回一个纸箱当前进程的命令行字符串的指针;

  2. CommandLineToArgvW: 该函数解析一个unicode命令行字符串,返回一个纸箱命令行参数的指针首地址(相当于标准C的argv),注意此函数的返回指针在使用完后需要调用LocalFree()释放;

  3. WideCharToMultiByte: 将宽字符集(UTF-16)的字符串转换为另一种字符集的字符串。

int WideCharToMultiByte(
  _In_       UINT CodePage,
  _In_       DWORD dwFlags,
  _In_       LPCWSTR lpWideCharStr,
  _In_       int cchWideChar,
  _Out_opt_  LPSTR lpMultiByteStr,
  _In_       int cbMultiByte,
  _In_opt_   LPCSTR lpDefaultChar,
  _Out_opt_  LPBOOL lpUsedDefaultChar
);
 


你可能感兴趣的:(vlc中使用到的windows api)