WindowsAPI笔记
GetModuleHandleA
HMODULE GetModuleHandleA(
LPCSTR lpModuleName
);
1.如果参数为空,那么返回当前进程的句柄
注意:返回的句柄就是该进程在内存中的基址(ImageBase)
句柄->基址------牢记
2.如果指定了参数,不给扩展名(如:.exe,.dll),那么默认是dll文件
该函数就会在程序进程中查找与参数相同的模块字符串
找到了,就返回该模块的句柄
没找到,返回NULL
GetModuleFileNameA
DWORD GetModuleFileNameA(
HMODULE hModule,
LPSTR lpFilename,
DWORD nSize
);
1.如果参数hModule为空,那么返回当前可执行文件的绝对路径字符串的长度,缓冲区lpFilename会存放该路径字符串,nSize表示最多保存多大的字符串(防止溢出)
2.如果指定了hModule,返回指定的模块的路径字符串的长度,缓冲区lpFilename中会存放该路径字符串,注意,这里指定的模块必须是已经加载到该进程之中的模块
WideCharToMultiByte
将字符串(宽字节字符串,也就是unicode字符串)映射到一个新的字符串(多字节字符串,可以是ANSI字符串)
宽字节字符串:每个字符2个字节
多字节字符串:每个字符可以是1个字节(1个字节就是ANSI),也可以是2个字节
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
_In_NLS_string_(cchWideChar)LPCWCH lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCCH lpDefaultChar,
LPBOOL lpUsedDefaultChar
)
参数:
CodePage
用于执行转换的代码页。可以将此参数设置为操作系统中已安装或可用的任何代码页的值。
如:CP_ACP:系统默认的Windows ANSI代码页
dwFlags
指示转换类型的标志。应用程序可以指定以下值的组合。当这些标志均未设置时,该函数执行速度更快。
(一般设为0)
lpWideCharStr
指向要被转换的Unicode字符串的指针
cchWideChar
lpWideCharStr指示的字符串的大小(以字符为单位)。或者,如果字符串以空值结尾,则可以将此参数设置为-1。如果将cchWideChar设置为0,该函数将失败。
如果此参数为-1,则该函数将处理整个输入字符串,包括终止null字符。
因此,结果字符串具有终止的空字符,并且长度函数返回的值包含此字符。
如果此参数设置为正整数,则该函数将精确处理指定数量的
字符。如果提供的大小不包含终止的空字符,则结果字符
字符串不是以空字符结尾的,并且返回的长度不包含此字符。
(一般设为-1)
lpMultiByteStr
指向接受转换后的字符串的缓冲区的指针
cbMultiByte
lpMultiByteStr指示的缓冲区大小(以字节为单位)。如果此参数设置为0,则该函数返回lpMultiByteStr所需的缓冲区大小,并且不使用输出参数本身。
(一般设置为MAX_PATH)
lpDefaultChar
如果无法在指定的代码页中表示字符,则指向要使用的字符的指针。如果函数要使用系统默认值,则应用程序将此参数设置为NULL。要获取系统默认字符,应用程序可以调用GetCPInfo或GetCPInfoEx函数。
欲了解CP_UTF7和CP_UTF8设置代码页,这个参数必须设置为NULL。否则,函数将失败,并显示ERROR_INVALID_PARAMETER。
(一般设为NULL)
lpUsedDefaultChar
指向标志的指针,该标志指示函数是否在转换中使用了默认字符。如果源字符串中的一个或多个字符不能在指定的代码页中表示,则将标志设置为TRUE。否则,将标志设置为FALSE。此参数可以设置为NULL。
欲了解CP_UTF7和CP_UTF8设置代码页,这个参数必须设置为NULL。否则,函数将失败,并显示ERROR_INVALID_PARAMETER。
(一般设为NULL)
例子:
WideCharToMultiByte(CP_ACP,0,oszFile,-1,dszFlie,MAX_PATH,NULL,NULL)
oszFile为需要被转换的字符串指针
dszFile为指向转换之后的字符串的缓冲区的指针
返回值:
如果成功,则返回新字符串那个指针指向的缓冲区的字节数
如果函数成功且cbMultiByte为0,则返回值是lpMultiByteStr指示的缓冲区所需的大小(以字节为单位)
如果失败,返回0
GlobalAlloc
从堆中分配指定的字节数(全局模式)
注意 全局功能比其他内存管理功能具有更大的开销并提供更少的功能。除非文档指出 |
---|
应使用全局函数,否则新应用程序应使用 堆函数。有关更多信息,请参见全局和局部函数 |
DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
UINT uFlags,
SIZE_T dwBytes
);
uFlags
内存分配属性。如果指定零,则默认值为GMEM_FIXED。除特别指出的不兼容组合外,此参数可以是以下一个或多个值。
值 | 含义 |
---|---|
ND0x0042 | 结合使用GMEM_MOVEABLE和GMEM_ZEROINIT。 |
GMEM_FIXED0x0000 | 分配固定内存。返回值是一个指针。 |
GMEM_MOVEABLE0x0002 | 分配可移动内存。内存块永远不会在物理内存中移动,但是它们可以在默认堆中移动。返回值是内存对象的句柄。要将句柄转换为指针,请使用 GlobalLock函数。该值不能与GMEM_FIXED结合使用。 |
GMEM_ZEROINIT0x0040 | 将内存内容初始化为零。 |
GPTR0x0040 | 结合使用GMEM_FIXED和GMEM_ZEROINIT。 |
dwBytes
要分配的字节数。如果此参数为零,并且uFlags参数指定GMEM_MOVEABLE,则该函数将句柄返回到标记为已丢弃的内存对象。
返回值:
如果函数成功,则返回值是新分配的内存对象的句柄(也就是分配的字节数的内存空间的首地址)。
如果函数失败,则返回值为NULL。要获取扩展的错误信息,请调用 GetLastError。
GlobalLock
说明:
锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处。除非用 GlobalUnlock 函数将内存块解锁,否则地址会一直保持有效。Windows为每个内存对象都维持着一个锁定计数。对这个函数的每次调用都应有一个对应的 GlobalUnlock 调用返回值Long,如成功,返回内存块的地址;如出错,或者这是一个已被丢弃的“可丢弃”内存块,则返回零。
意思就是用GlobalAlloc分配的内存空间(以字节为单位)需要用GlobalLock锁定后才能使用
LPVOID GlobalLock(
HGLOBAL hMem // 分配的全局内存对象的句柄(首地址)
)
hMem
[输入参数]全局内存对象句柄。该句柄由函数GlobalAlloc或GlobalReAlloc返回
返回值
如果函数执行成功,返回值就是指向内存对象首字节指针,否则返回NULL。
DROPFILES结构体
DROPFILES结构体用于文件拖拽时定义一个结构体
用法:
pBuf指向一块内存空间(以字节为单位)
使用DROPFILES结构体最终是想调用PostMessage()将目标空间文件(字节)拖拽到目标句柄,
也就是将某个文件按字节方式传递,拖拽到某个应用程序中
PostMessage(hWnd, WM_DROPFILES, (WPARAM)pBuf, NULL);
hWnd:目标程序的句柄
WM_DROPFILES:拖拽文件方式
pBuf:要被拖拽的内存空间首地址(以字节为单位拖拽)
GetWindowThreadProcessId与GetCurrentProcessId
DWORD GetWindowThreadProcessId(
HWND hWnd,
LPDWORD lpdwProcessId
)
GetWindowThreadProcessId( hWnd, &dwPID );
这个函数返回的是一个线程ID,但是存放在dwPID中的是进程ID(PID)
GetCurrentProcessId()返回的就是当前进程的PID
EnumWindows
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc,//回调函数
LPARAM lParam //这个参数也会传给回调函数
)
遍历屏幕上所有的顶层窗口,然后给回调函数传入每个遍历窗口的句柄
EnumWindows()最终会将遍历到的窗口句柄和参数lParam传给回调函数
当回调函数返回FALSE,枚举结束
返回值:
函数成功,返回非零
函数失败,返回零
如果回调函数返回零,则其返回值也为零
strcpy_s与_tcscpy_s
extern "C"在C++中到底是什么意思
extern “C” 就是表示用C的方式编译
常见完整写法:
#ifdef __cplusplus
extern "C"{
#endif
__declspec(dllexport) void fun()
{
return;
}
#ifdef __cplusplus
}
#endif
{}里面的代码就是表示用C的方式去编译
关于DLL中导出函数的问题:
未完待续。。。