无法解析的外部符号ShellExecuteExW

问题情况

在QT使用:ShellExecuteEx时遇上这么一个错误:遇上这么一个错误:
error: LNK2019: 无法解析的外部符号 __imp_ShellExecuteExW
在这里插入图片描述
*ReportService.obj👎 error: LNK2019: 无法解析的外部符号 __imp_ShellExecuteExW,该符号在函数 " 中被引用…

问题解决

配置Lib:
在项目pro文件上加上这句即可:
在这里插入图片描述
即:

#shellapi
LIBS += -L"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64" -lShell32

总结

知道:

#include <ShlObj.h>
BOOL ShellExecuteEx(
  _Inout_ SHELLEXECUTEINFO *pExecInfo
);
SHELLEXECUTEINFO参数说明:
typedef struct _SHELLEXECUTEINFO {
  DWORD     cbSize;//结构大小,sizeof(SHELLEXECUTEINFO)
  ULONG     fMask;//指定结构成员的有效性
  HWND      hwnd;//父窗口句柄或出错时显示错误父窗口的句柄,可以为 NULL
  LPCTSTR   lpVerb;//指定该函数的执行动作
  LPCTSTR   lpFile;//操作对象路径
  LPCTSTR   lpParameters;//执行参数,可以为 ULL
  LPCTSTR   lpDirectory;//工作目录,可以为 NULL
  int       nShow;//显示方式
  HINSTANCE hInstApp;//如果设置了 SEE_MASK_NOCLOSEPROCESS ,并且调用成功则该值大于32,调用失败者被设置错误值
  LPVOID    lpIDList;//ITEMIDLIST结构的地址,存储成员的特别标识符,当fMask不包括SEE_MASK_IDLIST或SEE_MASK_INVOKEIDLIST时该项被忽略
  LPCTSTR   lpClass;//指明文件类别的名字或GUID,当fMask不包括SEE_MASK_CLASSNAME时该项被忽略
  HKEY      hkeyClass;//获得已在系统注册的文件类型的Handle,当fMask不包括SEE_MASK_HOTKEY时该项被忽略
  DWORD     dwHotKey;//程序的热键关联,低位存储虚拟关键码(Key Code),高位存储修改标志位(HOTKEYF_),当fmask不包括SEE_MASK_HOTKEY时该项被忽略
  union {
    HANDLE hIcon;//取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略
    HANDLE hMonitor;//将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略
  } DUMMYUNIONNAME;
  HANDLE    hProcess;//指向新启动的程序的句柄。若fMask不设为SEE_MASK_NOCLOSEPROCESS则该项值为NULL。
                     //但若程序没有启动,即使fMask设为SEE_MASK_NOCLOSEPROCESS,该值也仍为NULL。
                     //如果没有新创建进程,也会为空
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

来自这个库就可以了:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64\Shell32.Lib
在这里插入图片描述

要实现WindTerm中rz命令弹出文件选择框的功能,需要使用go语言编写一个WinAPI程序,并在WindTerm中调用它。以下是基本的代码示例: ```go package main import ( "fmt" "syscall" "unsafe" ) var ( comdlg32 = syscall.NewLazyDLL("comdlg32.dll") getOpenFileName = comdlg32.NewProc("GetOpenFileNameW") getSaveFileName = comdlg32.NewProc("GetSaveFileNameW") ole32 = syscall.NewLazyDLL("ole32.dll") coTaskMemFree = ole32.NewProc("CoTaskMemFree") shell32 = syscall.NewLazyDLL("shell32.dll") dragQueryFileW = shell32.NewProc("DragQueryFileW") dragFinish = shell32.NewProc("DragFinish") shellExecuteExW = shell32.NewProc("ShellExecuteExW") shellNotifyIconW = shell32.NewProc("Shell_NotifyIconW") shellGetImageLists = shell32.NewProc("SHGetImageList") user32 = syscall.NewLazyDLL("user32.dll") sendMessageW = user32.NewProc("SendMessageW") postMessageW = user32.NewProc("PostMessageW") ) type openfilename struct { structSize uint32 hwndOwner uintptr hInstance uintptr filter *uint16 customFilter *uint16 maxCustomFilter uint32 filterIndex uint32 file *uint16 maxFile uint32 fileTitle *uint16 maxFileTitle uint32 initialDir *uint16 title *uint16 flags uint32 fileOffset uint16 fileExtension uint16 defExt *uint16 custData uintptr hook uintptr templateName *uint16 reserved uintptr flagsEx uint32 } func rzFileDialog() (string, error) { var ofn openfilename ofn.structSize = uint32(unsafe.Sizeof(ofn)) ofn.flags |= 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 // OFN_EXPLORER | OFN_NOCHANGEDIR | OFN_ALLOWMULTISELECT | OFN_PATHMUSTEXIST ofn.filter = syscall.StringToUTF16Ptr("All Files (*.*)\x00*.*\x00\x00") ofn.file = syscall.StringToUTF16Ptr(string(make([]uint16, 8192))) ofn.maxFile = uint32(len([]uint16(*ofn.file))) ofn.fileTitle = syscall.StringToUTF16Ptr(string(make([]uint16, 8192))) ofn.maxFileTitle = uint32(len([]uint16(*ofn.fileTitle))) ret, _, _ := getOpenFileName.Call(uintptr(unsafe.Pointer(&ofn))) if ret == 0 { return "", syscall.GetLastError() } defer coTaskMemFree.Call(uintptr(unsafe.Pointer(ofn.file))) defer coTaskMemFree.Call(uintptr(unsafe.Pointer(ofn.fileTitle))) return syscall.UTF16ToString((*[8192]uint16)(unsafe.Pointer(ofn.file))[:]), nil } func main() { file, err := rzFileDialog() if err != nil { fmt.Println("Error:", err) return } fmt.Println("Selected file:", file) } ``` 在WindTerm中,可以使用以下命令来调用此程序: ``` rz | go run filedialog.go ``` 这将在WindTerm中启动rz命令,并弹出文件选择框。选择文件后,程序将在WindTerm中输出所选文件的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员如山石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值