ShellExecute()函数包含在哪个lib库中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ShellExecute()函数包含在哪个lib库中?相关的知识,希望对你有一定的参考价值。

API函数 缩主文件 Shell32.dll

ShellExecute
说明 Shellexecute 函数用于对文件执行一个动词(verb). 它通常用于启动一个与特定文件类相关联的应用程序. 例如, 要启动 Word 来读一个 .doc 文件, 或启动 记事本 来编辑一个 .txt 文件. 用于第二个参数中的最常用的动词是 "Open", 但其它可用的动词是 "edit","print","explore" 和 "properties". 有趣的是, 使用 "mailto:" 或 "http://" 前缀, ShellExecute 函数也可用于以一个给定的邮件地址启动默认的邮件阅读器或给定的 URL 启动默认的浏览器.
缩主文件 Shell32.dll
在 VFP 中的定义
DECLARE INTEGER ShellExecute IN "Shell32.dll" ;
INTEGER hwnd, ;
STRING lpVerb, ;
STRING lpFile, ;
STRING lpParameters, ;
STRING lpDirectory, ;
LONG nShowCmd
Visual FoxPro 应用示例
* 打开 Word 来编辑文件 "c:\mywordfile.doc"
=Shellexecute(0,"Open","c:\mywordfile.doc","","",0)
* 打开默认的浏览器并定位到天堂论坛
=Shellexecute(0,"Open","http://www.dbwin.net/bbs/index.asp?boardID=1&page=1","","",0)
* 打开默认的邮件阅读器来发一封信给天堂版主
=Shellexecute(0,"Open","mailto:njjane@21cn.com","","",0)
* 打印文本文件 "c:\mytextfile.txt"
=Shellexecute(0,"Print","c:\mytextfile.txt","","",0)
参考技术A Vc中API函数 ShellExecute用法

1. 函数功能:

你可以给它任何文件的名字,它都能识别出来并打开它。

2.函数原型:

HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);

3.参数说明:
hwnd:
用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。
lpOperation:
用于指定要进行的操作。
“open”操作表示执行由lpFile参数指定的程序,或打开由lpFile参数指定的文件或文件夹;
“print”操作表示打印由lpFile参数指定的文件;
“explore”操作表示浏览由lpFile参数指定的文件夹。
当参数设为NULL时,表示执行默认操作“open”。
参考技术B 自己找呗. 参考技术C shell32.lib

参考资料:http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx

静态链接库和动态链接库

静态链接库和动态链接库

共有两种库:

一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。

一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。

共有两种链接方式:

动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。

静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。

关于lib和dll的区别如下:

(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。

(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。

(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。

编译生成LIB

创建win32控制台程序,勾选LIB类型。增加并编写app,生成解决方案

1>------ 已启动生成:  项目: test, 配置: Debug Win32 ------
1>  test.cpp
1>  test.vcxproj -> D:\visual studio\test\Debug\test.lib
========== 生成:  成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

编译生成DLL:

创建win32控制台程序,勾选DLL类型,创建add.h

#ifndef __ADD_H__
#define __ADD_H__
extern "C" int _declspec(dllexport) add(int x, int y);
#endif

这里注意:使用 _declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。_declspec(dllexport) 会将导出指令添加到对象文件中,如果不适用dllexport,则动态使用dll的时候找不到函数

创建add.cpp

#include "add.h"
int add(int a, int b)
{
    return a + b;
}

然后点击生成---生成解决方案,会在工程的Debug目录下生成一个DLL文件(add.dll)

1> add.vcxproj -> D:\visual studio\add\Debug\add.dll
动态调用DLL(仅需要DLL,不需要头文件和LIB)
#include <iostream>
#include <windows.h>
using namespace std;
typedef int(*FUN)(int, int);//定义指向和DLL中相同的函数原型指针
int main() 
{
    int x, y;
    HMODULE hDLL = LoadLibrary("D:\\visual studio\\add\\Debug\\add.dll");//加载dll
    if (hDLL != NULL)
    {
        FUN add = FUN(GetProcAddress(hDLL, "add"));//获取导入到应用程序中的函数指针,根据方法名取得
        if (add != NULL)
        {
            cout << "Input 2 Numbers:";
            cin >> x >> y;
            cout << add(x, y) <<endl;
        }
        else
        {
            cout << "Cannot Find Function"  << endl;
        }
        FreeLibrary(hDLL);
    }
    else
    {
        cout << "Cannot Find dll"  << endl;
    }
    return 1;
}

生成结果:

Input 2 Numbers:3 4
7
请按任意键继续. . .

静态调用(同时需要头文件、LIB和DLL文件,缺一不可)

1:将dll工程下的dll和lib拷贝到测试工程中的debug文件夹

2:编写测试工程的头文件

#ifndef __USEDll_H__
#define __USEDll_H__
extern "C" _declspec(dllimport) int add(int x, int y);
#endif

3:编写cpp文件

#include "UseDll.h"
#include <iostream>
using namespace std;
#pragma comment(lib,"D:\\visual studio\\UseDll\\Debug\\add.lib")
int main()
{
    int x, y;
    cout << "Input 2 Numbers:";
    cin >> x >> y;
    cout << add(x, y) <<endl;
}

运行结果如下:

Input 2 Numbers:10 10
20
请按任意键继续. . .

说明:#pragma comment (lib,"...lib")就是告诉链接器优先链接该lib文件,除了使用此语句外,可以在工程属性-->链接器--> 输入-->附加依赖项中添加此lib。此时该lib需要放到系统路径下。

这里注意,这里的lib是生成dll的时候生成的,相对于生成lib时候产生的lib要小,其实这种是导入库,并不是静态库,静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表,各个函数地址等等,确保程序找到对应函数的一些基本地址信息。

 

参考文档:https://blog.csdn.net/red10057/article/details/7394213

https://blog.csdn.net/Sya_inn/article/details/53981440

http://www.cppblog.com/amazon/archive/2009/09/04/95318.html

 

以上是关于ShellExecute()函数包含在哪个lib库中?的主要内容,如果未能解决你的问题,请参考以下文章

MessageBox和ShellExecute初体验

函数 assert() 是干啥的 包含在哪个库中

OpenDDS 中的哪个库包含“OpenDDS::DCPS::operator<<”?

C++的静态库lib是可以包含函数的注释(说明文档)的

彻底理解lib和dll

如何从 lib .so 文件中查找函数?