需求:在VB中打开一个*.pdf的文件,操作系统中已经安装了acrobat reader 7.0了。实现步骤:
1、我首先使用Shell()来打开文件,结果发现,Shell只能执行exe程序。而执行(打开)某个PDF文件报错“无效过程调用或参数”
2、第一种方法实现不了之后,我想用windows API即 ShellExcute函数,因为我在C语言中是可以正常使用的,函数入口在Shell32.lib中。函数原形为
HINSTANCE ShellExecute(
    HWND hwnd, 
    LPCTSTR lpVerb,
    LPCTSTR lpFile, 
    LPCTSTR lpParameters, 
    LPCTSTR lpDirectory,
    INT nShowCmd
);
所以在VB中,我这样声明
Private Declare Function ShellExecute Lib "shell32" (ByVal hwnd As Integer, _
    ByVal lpVerb As String, ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer
但是一执行,就报错“找不到 DLL 入口点 ShellExcute in shell32”。 问题:我的代码有什么错误吗?

解决方案 »

  1.   

    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
      

  2.   

    多谢!
    问题解决了。给分!
    但是,请问为什么要一个Alias "ShellExecuteA"? Alias "ShellExecuteB" 行不行,这个是VB的惯例吗?
      

  3.   

    但是这样在没有装acrobat reader 7.0的机器上却没有任何反应,我想打开文件时先判断一下系统有没有与之相关联的程序,怎么做?
      

  4.   

    使用Alias关键字指出API函数的别名,如果我们调用的API函数要使用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,以保证不出现声明错误,一般来说把API函数名后加一个大写A作为别名即可。
      

  5.   

    但是这样在没有装acrobat reader 7.0的机器上却没有任何反应,我想打开文件时先判断一下系统有没有与之相关联的程序,怎么做?