gjing
驱动牛犊
驱动牛犊
  • 注册日期2002-03-28
  • 最后登录2006-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5939回复:21

请教:关于用installshield对驱动程序打包安装

楼主#
更多 发布于:2002-11-01 13:07
  在installshield作安装盘的时候,怎么处理驱动程序,使得它在安被时可被正确装入系统?
  思路是否:1.先做一dll,参照ntddk/src/setup
           2.installshield调用该dll
  
  我需要一简单dll框架,望大家帮忙,谢谢.
    
  

最新喜欢:

aasa2aasa2 SWLEOSWLEO
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-01 16:06
关注,帮你up一下!
bbear
驱动小牛
驱动小牛
  • 注册日期2002-08-20
  • 最后登录2009-04-16
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-01 16:29

 

1.先做一dll,参照ntddk/src/setup
2.installshield调用该dll
 


xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-01 17:00
楼上的大侠,请问用过SetupInstallFilesFromInfSection or SetupInstallServicesFromInfSection 等函数吗?
gjing
驱动牛犊
驱动牛犊
  • 注册日期2002-03-28
  • 最后登录2006-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-01 17:26
    下面是我的一dll(VC创建),和Installshield的简单调用,测试的结果是没有调用到dll,请大家帮忙看看,谢了.

DLL代码如下:

#include \"stdafx.h\"

__declspec( dllexport ) LONG APIENTRY func(HWND hwnd, LPLONG lpIValue, LPSTR lpszValue);

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
)
{
    return TRUE;
}


LONG APIENTRY func(HWND hwnd, LPLONG lpIValue, LPSTR lpszValue)
{
       return 100;
}




InstallShield代码如下:

function OnFirstUIBefore()
    NUMBER  nResult,nSetupType;
    STRING  szTitle, szMsg;
    STRING  szDir;  
    STRING  svMssg;
    INT    nValue;
    STRING szString,szDllName;

begin
    TARGETDIR = PROGRAMFILES ^@COMPANY_NAME ^@PRODUCT_NAME;
    szDir = TARGETDIR;

Dlg_Start:

Dlg_SdWelcome:
    szTitle = \"\";
    szMsg   = \"\";
    nResult = SdWelcome( szTitle, szMsg );
    if (nResult = BACK) goto Dlg_Start;

Dlg_SdAskDestPath:
    szTitle = \"\";
    szMsg   = \"\";
    nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );
    TARGETDIR = szDir;
    if (nResult = BACK) goto Dlg_SdWelcome;

Dlg_ObjDialogs:
    nResult = ShowObjWizardPages(nResult);
    if (nResult = BACK) goto Dlg_SdAskDestPath;
                    
  
    //这里是我添加,调用DLL的代码:
     nValue   = 3000;
     szString = \"Test String\";
     szDllName = \"E:\\\\My Work\\\\TRYDLL1.dll\";
     nResult = CallDLLFx(szDllName,
                \"func\",
                 nValue,
                 szString);
  
     Sprintf (svMssg, \"Result is %ld\", nResult);
     MessageBox (svMssg, INFORMATION);

                    
    // setup default status
    SetStatusWindow(0, \"\");
    Enable(STATUSEX);
    StatusUpdate(ON, 100);
          
          
          
    return 0;
end;




   InstallShield测试结果是返回-1,而不是DLL函数中的100.



  
bbear
驱动小牛
驱动小牛
  • 注册日期2002-08-20
  • 最后登录2009-04-16
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-01 18:04
   下面是我的一dll(VC创建),和Installshield的简单调用,测试的结果是没有调用到dll,请大家帮忙看看,谢了.

DLL代码如下:

#include \"stdafx.h\"

__declspec( dllexport ) LONG APIENTRY func(HWND hwnd, LPLONG lpIValue, LPSTR lpszValue);

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
)
{
    return TRUE;
}


LONG APIENTRY func(HWND hwnd, LPLONG lpIValue, LPSTR lpszValue)
{
       return 100;
}



  



你增加一
bbear
驱动小牛
驱动小牛
  • 注册日期2002-08-20
  • 最后登录2009-04-16
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-01 18:16
楼上的大侠,请问用过SetupInstallFilesFromInfSection or SetupInstallServicesFromInfSection 等函数吗?


Sorry,
use_id
驱动中牛
驱动中牛
  • 注册日期2002-03-11
  • 最后登录2006-01-07
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-02 16:26
驱动的按装你都可以做, 为什么不自己写一个按装程序?
SWLEO
驱动牛犊
驱动牛犊
  • 注册日期2002-10-12
  • 最后登录2003-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-04 23:28
 
在installshield作安装盘的时候,怎么处理驱动程序,使得它在安被时可被正确装入系统?
 


太巧了,我也正好碰到这个问题要解决,一起探讨一下。

我觉得你的方法还是很可行的,把ddk示例的函数做成dll。不过你的dll函数可能加错地方了,应该是加在OnMoving事件中吧

我明天去公司也试试,有什么我们再交流

哈哈,希望我们合作愉快!!
多谢指点
gjing
驱动牛犊
驱动牛犊
  • 注册日期2002-03-28
  • 最后登录2006-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-05 08:59
   把ddk示例的函数做成dll,或者说利用SetupApi函数实现DLL,是自动安装驱动的关键且最困难的环节,我暂时还没搞定,请大家多帮忙,谢谢.
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-05 12:15
巨简单的事情!

如果是那些For VC/Delphi的IS,就弄个DLL;如果是完全版的IS,就可以直接在scripts里面调用Windows系统DLL的所有输出函数,根本就不需要再写一个DLL,详细的方法它的Help里面有讲。但不管怎样,都应该在copy文件以后再install driver。

如果要在uninstall的时候卸载driver,可以在对应程序的registry里面加上uninstall的参数,调用uninstall dll,在这个dll里面可以卸载driver。但是,MS并不推荐卸载driver。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
gjing
驱动牛犊
驱动牛犊
  • 注册日期2002-03-28
  • 最后登录2006-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-05 13:29
版主:你好!
    这个问题已困扰我很久了.
    你说的,无论是自己写DLL也好,还是直接在installshield scripts里面调用Windows系统DLL的所有输出函数也好,终归还是要调用SetupApi函数,这点我明白,但我现在最最关心的是你提到的这些函数,尽管msdn里有详细的帮助,但使用太困难了,到底只需用几个就够?
   我搜索了论坛上所有相关帖子,这始终是悬而未决的问题,请版主指点,谢谢.
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-06 12:29
如果只是为了装一个inf,只要用SetupCopyOEMInf即可;如果是装KMD,当然是用ServiceManager的那些函数。9x下面的安装方法和这些不同。

我在1年前的“several tips“里面已经讲过了这些内容,你只要把里面的步骤做到你的is里面即可。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
gjing
驱动牛犊
驱动牛犊
  • 注册日期2002-03-28
  • 最后登录2006-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-06 16:43
谢谢老大,我已搞定
SWLEO
驱动牛犊
驱动牛犊
  • 注册日期2002-10-12
  • 最后登录2003-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-06 17:45
如何解决的,朋友?
帮帮忙啊
多谢指点
gjing
驱动牛犊
驱动牛犊
  • 注册日期2002-03-28
  • 最后登录2006-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-06 19:28
DLL代码:

LONG APIENTRY func(HWND hwnd, LPLONG lpIValue, LPSTR lpszValue)
{
  if(!SetupCopyOEMInf(lpszValue,
                      NULL,
                      SPOST_PATH,
                      SP_COPY_DELETESOURCE,
                      NULL,
                      0,
                      NULL,
                      NULL ))
      return 0;
  else
      return 1;
}




Installshield for vc6 代码:

function CleanUpInstall()
    int nValue,nResult;
    STRING szString,szDllName;
 begin

 if (bInstallAborted) then
      return 0;
 endif;

 DialogShowSdFinishReboot();

  if (BATCH_INSTALL) then // ensure locked files are properly written
      CommitSharedFiles(0);
  endif;



  if( bWinNT = FALSE )then
    SRCDIR =  svDir;
    TARGETDIR  = WINDIR+\"Inf\\\\\";
    DeleteFile( \"Drvdata.bin\" );
    DeleteFile( \"Drvidx.bin\" );
    CopyFile( \"Rice66.inf\" , \"Rice66.inf\" );
    TARGETDIR = WINDIR+\"SYSTEM32\\\\DRIVERS\\\\\";
    CopyFile( \"Rice66.sys\" , \"Rice66.sys\" );
  else
    nValue = 3000;
    szString =  svDir+\"\\\\Rice66.inf\";
    szDllName = svDir+\"\\\\MyTryDll2.dll\";
    nResult = CallDLLFx(szDllName,
                        \"func\",
                        nValue,
                        szString);
    // Show values returned by DLL function.
    SprintfBox(INFORMATION,  \"\", \"Returned - nValue: %i , szString: %s, nResult :%i \",
    nValue, szString ,nResult );
  endif;


  return 0;
 end;



SWLEO
驱动牛犊
驱动牛犊
  • 注册日期2002-10-12
  • 最后登录2003-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-08 10:30
是不是不用向导,生成个空的工程,直接在脚本里添加

但你的程序我有些看不懂,
像cleanupinstall()是你自己定义的?

if (bInstallAborted) then

if (BATCH_INSTALL) then

if( bWinNT = FALSE )then

我是新手,问的问题很菜,请多帮忙,非常感谢!
多谢指点
gjing
驱动牛犊
驱动牛犊
  • 注册日期2002-03-28
  • 最后登录2006-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-08 12:21
1.用向导
2.cleanupinstall()向导生成
cherry97
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2002-12-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-08 15:31
gjing大侠,看了你提供的程序,我想问一下:

你的DLL里只使用了SetupCopyOEMInf,这个函数的作用好像就是COPY INF文件,不需要使用DDK的install里的那些SetipDiXXXX函数吗?
imicer
驱动小牛
驱动小牛
  • 注册日期2002-06-20
  • 最后登录2011-12-08
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望90点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-08 18:19
我只用了inf与sys,用installsheild,完成了驱动安装,98下需要重新启动,但2000下不需要,关键还是在inf文件的正确。
上一页
游客

返回顶部