阅读:3511回复:27
pc模拟环境下是否可以通过ActiveDeviceEx加载驱动?
我已经把注册表和驱动DLL的接口全部准备好了,可是调用ActiveDeviceEx就是不成功
|
|
论坛版主
|
沙发#
发布于:2004-12-02 14:02
你看看你的注册表设置和驱动输出的接口对不对,也就是.def的函数和注册表的prefix一致不,另外如果有中间层(你的驱动和上层某个库链接),你的prefix要和中间层的接口名字一致。
更直接的检查是看看getlasterror或输出错误信息 |
|
板凳#
发布于:2004-12-02 15:34
to wxl_50685330:
我是用EVC生成的动态连接库,注册表和函数接口的都对应了,动态连接库主要为了试验,很简单几乎没有任何实际的操作,但所有必须具备的函数都有,如下,注册表里prefix是TST。 TST_Init TST_Deinit TST_Open TST_Close TST_Read TST_Write TST_Seek TST_IOControl TST_PowerUp TST_PowerDown 看了wxl_50685330的回复,我才发现,我这个EVC生成的DLL工程没有def文件,不只为何? 然后自己做了一个,把内容添上去,编译,还是加载不上 :( 我在DLL的DLLMain和上述函数中都添加了打印信息,发现根本连DLLmain都没有进入! 困扰了还几天了,还是没有解决,帮帮忙把。本人感激涕零 |
|
地板#
发布于:2004-12-03 11:11
你这个动态链接库是在哪里加载的啊?是由你的mdd自动加载的吗?是通过哪个函数加载的?
|
|
|
地下室#
发布于:2004-12-03 12:43
用自己的应用程序加载, 在应用程序里调用ActivateDeviceEx()
|
|
论坛版主
|
5楼#
发布于:2004-12-03 13:35
没有进入dllmain说明你的动态连接库还没有被加载,这之前阻止dll加载的判断全部和注册表相关,你要仔细设置注册表项,有些项不对会马上返回,activatedevice就没机会调用RegisterDevice了
注意事项是: 注册表位置要配对,也就是给activatedevice的参数(注册表项)一定要存在,比如HKEY_LOCAL_MACHINE\\Drivers\\xxx\\yyy flag要么不设,要么设成0 给出dll名字名字,“dll"="xxx.dll” index可以不设,设了不要大于9 你再试试,最起码把dll加载上再说 |
|
6楼#
发布于:2004-12-03 15:46
wxl_50685330大哥,我也有问题要问:
本来呢,我通过在Builtin中增加我的驱动的注册表项可以在CE启动时由设备管理程序加载。 我现在想试试在应用中由ActivateDeviceEx函数来加载我的驱动。我把我的驱动的注册表项原封不动的放到了另外一个位置如: HKEY_LOCAL_MACHINE\Drivers\xxx\yyy :) 我在应用中直接调用ActivateDeviceEx(key,NULL,0,NULL);这里key的值即为HKEY_LOCAL_MACHINE\Drivers\xxx\yyy。结果是虽然返回值为0,但是根本没有进入我的驱动的Dllmain中。何故? :mad: |
|
|
论坛版主
|
7楼#
发布于:2004-12-06 12:46
GetLastError返回什么?我有时间试试看:)
|
|
8楼#
发布于:2004-12-07 07:52
谢谢wxl_50685330
这两天又忙别的事情了,一直没有试,等有进一步的结果我再请教。 |
|
9楼#
发布于:2004-12-09 10:19
to wwei_wang: 不知你成功没有,如果成功是什么原因呀?我的ActivatedeviceEx还是不行.
to wxl_50685330: 我现在不用模拟环境了,用一个工控主板加wince,evc装了该主板的sdk,重复以前的工作,编写dll,修改注册表,应用程序调用ActivateDeviceEx, 发现dll还是没有加载,苦闷呀。现在把所有的程序贴出来,wxl_50685330一定帮我看看。 def文件: LIBRARY drvdll EXPORTS TST_Init TST_Deinit TST_Open TST_Close TST_Read TST_Write TST_Seek TST_IOControl TST_PowerUp TST_PowerDown dll的cpp文件: #include "stdafx.h" typedef class CDriverContext * PDriverContext, * HDRIVER; typedef struct _tag_OPENHANDLE { HDRIVER hDriver; } OPENHANDLE, *POPENHANDLE; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { RETAILMSG(1, (TEXT("enter dllmain"))); return TRUE; } BOOL TST_Init( PCTSTR pszActiveKey ) { RETAILMSG(1, (TEXT("enter init"))); return TRUE; } BOOL TST_Deinit( ) { return TRUE; } VOID TST_PowerUp(HDRIVER pDriver) { } VOID TST_PowerDown( HDRIVER pDriver ) { } POPENHANDLE TST_Open( HDRIVER pDriver, DWORD dwAccess, DWORD dwShareMode ) { return NULL; } BOOL TST_Close( POPENHANDLE pOpenHandle ) { return TRUE; } DWORD TST_Read( POPENHANDLE pOpenHandle, LPVOID pBuf, DWORD Len ) { return 0; } DWORD TST_Write( POPENHANDLE pOpenHandle, LPCVOID pBuf, DWORD Len ) { return 0; } DWORD TST_Seek( POPENHANDLE pOpenHandle, long pos, DWORD type ) { return (DWORD)-1; } BOOL TST_IOControl( POPENHANDLE pOpenHandle, DWORD dwCode, PVOID pBufIn, DWORD dwLenIn, PDWORD pdwBufOut, DWORD dwLenOut, PDWORD pdwActualOut ) { return TRUE; } 修改注册表程序: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { HKEY hKey; LPDWORD p = 0 ; TCHAR ch[] = TEXT("Drivers\MyDriver\JD45"); LONG rc = RegCreateKeyEx(HKEY_LOCAL_MACHINE, ch, 0, NULL, 0, NULL, NULL, &hKey, p); if(rc != ERROR_SUCCESS) { RegCloseKey (hKey); } TCHAR Dllname[] = TEXT("drvdll.dll"); rc = RegSetValueEx(hKey, TEXT("Dll"), 0, REG_SZ, (PBYTE)Dllname, (lstrlen (Dllname)+1) * sizeof(TCHAR)); TCHAR Prefix[] = TEXT("TST"); rc = RegSetValueEx(hKey, TEXT("Prefix"), 0, REG_SZ, (PBYTE)Prefix, (lstrlen (Prefix)+1) * sizeof (TCHAR)); DWORD index = 0; rc = RegSetValueEx(hKey, TEXT("Index"), 0, REG_DWORD, (PBYTE)&index, 4); DWORD order = 1; rc = RegSetValueEx(hKey, TEXT("Order"), 0, REG_DWORD, (PBYTE)&order, 4); RegCloseKey (hKey); return 0; } 加载驱动程序: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { LPCWSTR ptr= "HKEY_LOCAL_MACHINE\Drivers\MyDriver\JD45"; DWORD m; HANDLE hDev = ActivateDeviceEx(ptr, NULL, 0, NULL); m = GetLastError(); RETAILMSG(1, (TEXT("ActivateDevice code = %drn")),m); return 0; } 将dll下载到目标板,运行修改注册表的程序,发现注册表已经改变,运行加载程序,发现hDev仍然是0,看到到打印出来的错误码是59。不知道哪里除了问题。 |
|
论坛版主
|
10楼#
发布于:2004-12-09 14:04
我试试哈
1.你的drvdll.dll放到什么地方的?试试放到\\windows下 2.LPCWSTR ptr= TEXT("HKEY_LOCAL_MACHINE\\Drivers\\MyDriverJD45"); 3..def里面LIBRARY drvdll写成LIBRARY STRATAD 4.在注册表设"Flags"=dword:00000002 再试试呢 |
|
论坛版主
|
11楼#
发布于:2004-12-09 14:05
2.LPCWSTR ptr= TEXT("HKEY_LOCAL_MACHINE\\\\Drivers\\\\MyDriverJD45");
|
|
12楼#
发布于:2004-12-09 14:28
我的程序里本来是:LPCWSTR ptr= TEXT("HKEY_LOCAL_MACHINE\\Drivers\\MyDriver\\JD45");拷贝的时候掉了\\
我在注册表里添加了Flag 设为2 可是还是不行,返回仍然是0 |
|
13楼#
发布于:2004-12-09 14:30
.def里面LIBRARY drvdll 也改成LIBRARY STRATAD
:( 55555 |
|
论坛版主
|
14楼#
发布于:2004-12-09 15:58
哈哈哈哈,不是吧,还是不行?是不是非要我亲自动手麻:)))
对了,是两个\\喔,实在不行... |
|
论坛版主
|
15楼#
发布于:2004-12-09 16:01
能重新链接os不?再试试把dll放到bib的modules里面呢
|
|
论坛版主
|
16楼#
发布于:2004-12-09 16:07
等等,我好像知道了!!!!
LPCWSTR ptr= TEXT("Drivers\\\\MyDriver\\\\JD45") |
|
17楼#
发布于:2004-12-09 16:18
wxl_50685330
你真神了,太谢谢你了,我终于加载成功了,感激涕零 |
|
18楼#
发布于:2004-12-09 16:20
就是ptr的问题,不该加HKEY_LOCAL_MACHINE,
的确应该是LPCWSTR ptr= TEXT("Drivers\\MyDriver\\JD45") :) |
|
19楼#
发布于:2004-12-09 16:59
hehe,还几个事情不太清楚,想请教wxl_50685330:
1:应用程序调用ACtivateDeviceEx时,驱动里的XXX_Init应该被调用吧,可是我发现我在Init里的打印信息并没有输出, DLLMain里信息的也没有输出, 但是注册表里的Active键已经添加了我的驱动的信息。 2:我用设备名 TST0: 打开设备的时候,返回的句柄无效,错误代码时55,设备不存在, 这是为何? |
|
上一页
下一页