阅读:5939回复:21
请教:关于用installshield对驱动程序打包安装
在installshield作安装盘的时候,怎么处理驱动程序,使得它在安被时可被正确装入系统?
思路是否:1.先做一dll,参照ntddk/src/setup 2.installshield调用该dll 我需要一简单dll框架,望大家帮忙,谢谢. |
|
沙发#
发布于:2002-11-01 16:06
关注,帮你up一下!
|
|
板凳#
发布于:2002-11-01 16:29
先 |
|
地板#
发布于:2002-11-01 17:00
楼上的大侠,请问用过SetupInstallFilesFromInfSection or SetupInstallServicesFromInfSection 等函数吗?
|
|
地下室#
发布于: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. |
|
5楼#
发布于:2002-11-01 18:04
下面是我的一dll(VC创建),和Installshield的简单调用,测试的结果是没有调用到dll,请大家帮忙看看,谢了. 你增加一 |
|
6楼#
发布于:2002-11-01 18:16
楼上的大侠,请问用过SetupInstallFilesFromInfSection or SetupInstallServicesFromInfSection 等函数吗? Sorry, |
|
7楼#
发布于:2002-11-02 16:26
驱动的按装你都可以做, 为什么不自己写一个按装程序?
|
|
8楼#
发布于:2002-11-04 23:28
在installshield作安装盘的时候,怎么处理驱动程序,使得它在安被时可被正确装入系统? 太巧了,我也正好碰到这个问题要解决,一起探讨一下。 我觉得你的方法还是很可行的,把ddk示例的函数做成dll。不过你的dll函数可能加错地方了,应该是加在OnMoving事件中吧 我明天去公司也试试,有什么我们再交流 哈哈,希望我们合作愉快!! |
|
|
9楼#
发布于:2002-11-05 08:59
把ddk示例的函数做成dll,或者说利用SetupApi函数实现DLL,是自动安装驱动的关键且最困难的环节,我暂时还没搞定,请大家多帮忙,谢谢.
|
|
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。 |
|
|
11楼#
发布于:2002-11-05 13:29
版主:你好!
这个问题已困扰我很久了. 你说的,无论是自己写DLL也好,还是直接在installshield scripts里面调用Windows系统DLL的所有输出函数也好,终归还是要调用SetupApi函数,这点我明白,但我现在最最关心的是你提到的这些函数,尽管msdn里有详细的帮助,但使用太困难了,到底只需用几个就够? 我搜索了论坛上所有相关帖子,这始终是悬而未决的问题,请版主指点,谢谢. |
|
12楼#
发布于:2002-11-06 12:29
如果只是为了装一个inf,只要用SetupCopyOEMInf即可;如果是装KMD,当然是用ServiceManager的那些函数。9x下面的安装方法和这些不同。
我在1年前的“several tips“里面已经讲过了这些内容,你只要把里面的步骤做到你的is里面即可。 |
|
|
13楼#
发布于:2002-11-06 16:43
谢谢老大,我已搞定
|
|
14楼#
发布于:2002-11-06 17:45
如何解决的,朋友?
帮帮忙啊 |
|
|
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; |
|
16楼#
发布于:2002-11-08 10:30
是不是不用向导,生成个空的工程,直接在脚本里添加
但你的程序我有些看不懂, 像cleanupinstall()是你自己定义的? if (bInstallAborted) then if (BATCH_INSTALL) then if( bWinNT = FALSE )then 我是新手,问的问题很菜,请多帮忙,非常感谢! |
|
|
17楼#
发布于:2002-11-08 12:21
1.用向导
2.cleanupinstall()向导生成 |
|
18楼#
发布于:2002-11-08 15:31
gjing大侠,看了你提供的程序,我想问一下:
你的DLL里只使用了SetupCopyOEMInf,这个函数的作用好像就是COPY INF文件,不需要使用DDK的install里的那些SetipDiXXXX函数吗? |
|
19楼#
发布于:2002-11-08 18:19
我只用了inf与sys,用installsheild,完成了驱动安装,98下需要重新启动,但2000下不需要,关键还是在inf文件的正确。
|
|
上一页
下一页