找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 316|回复: 3

炫彩模块如何封装系统API或者第三方dll命令

[复制链接]

13

主题

21

回帖

238

积分

中级会员

积分
238
QQ
发表于 2024-9-26 22:46:35 | 显示全部楼层 |阅读模式
悬赏1金钱已解决
本帖最后由 zl2024 于 2024-9-26 22:45 编辑

本来是想封装一些dll命令到模块方便使用
但是遇到问题
比如像下面这样在项目可以正常使用
#DLL导入表["user32.dll"]
        函数 整型 WINAPI 定时关闭消息框A(HWND 窗口句柄, 字符型A* 弹出窗体内容, 字符型A* 弹出窗体的标题, 整型 弹出的按钮类型, 整型 语言ID, 整型 延迟的时间) : MessageBoxTimeoutA

定时关闭消息框A(0, A"内容", A"标题", 0, 1, 2000)


现在我想把这个dll命令放到模块方便在别的项目使用,但是放到炫语言的模块模板里面不会出现这个函数,也就无法调用
后来想了一个方法把dll命令先封装成函数再调用
函数 整型 定时关闭消息框A_(HWND 窗口句柄, 字符型A* 弹出窗体内容, 字符型A* 弹出窗体的标题, 整型 弹出的按钮类型, 整型 语言ID, 整型 延迟的时间)
        返回 定时关闭消息框A(窗口句柄, 弹出窗体内容, 弹出窗体的标题, 弹出的按钮类型, 语言ID, 延迟的时间)
但是这样调用还是出现问题

改用另一种方法,直接把C++的API代码放到到系统API模块h文件里面
//@别名 定时关闭消息框A()
int MessageBoxTimeoutA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds);
但调用时也报错
错误 C3861: “定时关闭消息框A”: 找不到标识符



最佳答案

查看完整内容

不用写为h文件形式模块的,就引用一下外部源码目录就OK了!改源码比改h,CPP文件方便多了!!如这样做 https://bbs.125.la/forum.php?mod=viewthread&tid=14814709&extra=

34

主题

157

回帖

870

积分

高级会员

积分
870
发表于 2024-9-26 22:46:36 | 显示全部楼层
不用写为h文件形式模块的,就引用一下外部源码目录就OK了!改源码比改h,CPP文件方便多了!!如这样做
https://bbs.125.la/forum.php?mod ... 14814709&extra=

34

主题

157

回帖

870

积分

高级会员

积分
870
发表于 2024-9-27 00:59:03 | 显示全部楼层
那个h,CPP文件形式的模块是给会VS的人用的!!我们不会用VS.还是老实用XC文件写东西吧!实制用置入代码写源码模块一点也不比已选模块的差,改源码还方便.已选模块的东西基本都在VS调试OK了才加上别名的!

6

主题

5

回帖

147

积分

注册会员

积分
147
QQ
发表于 2024-9-27 11:07:21 | 显示全部楼层
本帖最后由 bestkakkoii 于 2024-9-27 11:31 编辑

MessageBoxTimeout 不是公开的,是未文檔化函数,需要自己用 GetProcAddress 获取指针才能使用


可将如下放置 .h中
  1. //@别名 定时消息框(父窗口句柄,内容字符指针,标题字符指针,类型,毫秒超时时长)
  2. int MessageBoxWithTimeout(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType, DWORD dwMilliseconds)
  3. {
  4.     using MessageBoxTimeoutProc = int (WINAPI*)(HWND, LPCTSTR, LPCTSTR, UINT, WORD, DWORD);

  5.     HMODULE hUser32 = GetModuleHandle(L"User32.dll");
  6.     if (nullptr == hUser32)
  7.     {
  8.         return -1;
  9.     }

  10.     MessageBoxTimeoutProc func = reinterpret_cast<MessageBoxTimeoutProc>(GetProcAddress(hUser32, "MessageBoxTimeoutW"));
  11.     if (nullptr == MessageBoxTimeout)
  12.     {
  13.         return -1;
  14.     }

  15.     return func(hWnd, lpText, lpCaption, uType, 0, dwMilliseconds);
  16. }

复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|炫语言 | 炫彩界面库 | 用户所需, 正是我所做! ( 鄂ICP备2023014763号-1 )

GMT+8, 2025-1-29 06:48 , Processed in 0.073567 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表