WindowsAPI笔记

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。要获取系统默认字符,应用程序可以调用GetCPInfoGetCPInfoEx函数。

欲了解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_MOVEABLEGMEM_ZEROINIT
GMEM_FIXED0x0000分配固定内存。返回值是一个指针。
GMEM_MOVEABLE0x0002分配可移动内存。内存块永远不会在物理内存中移动,但是它们可以在默认堆中移动。返回值是内存对象的句柄。要将句柄转换为指针,请使用 GlobalLock函数。该值不能与GMEM_FIXED结合使用。
GMEM_ZEROINIT0x0040将内存内容初始化为零。
GPTR0x0040结合使用GMEM_FIXEDGMEM_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中导出函数的问题:

在这里插入图片描述

未完待续。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值