none
关于wince下显式调用DLL驱动的问题,请老师们赐教... RRS feed

  • 问题

  • EXE程序为MultiPlatform.exe,dll名称为radio2.dll两个都放在SD卡里,SD的名字是Storage CardEXEDLL是在VS2005下一个解决方案的两个工程,用的SDK是通用的STANDARDSDK_500SDK

    DLL采用的是常规DLL共享MFC库,具体代码如下:

    BEGIN_MESSAGE_MAP(CRadio2App, CWinApp)

    END_MESSAGE_MAP()

    // CRadio2App construction

    CRadio2App::CRadio2App()

    {

         // TODO: add construction code here,

         // Place all significant initialization in InitInstance

    }

    // The one and only CRadio2App object

    CRadio2App theApp;

    // CRadio2App initialization

    BOOL CRadio2App::InitInstance()

    {

         CWinApp::InitInstance();

         return TRUE;

    }

    void WINAPI RadioInit(void)

    {AfxMessageBox(_T("1234567890"));

    RETAILMSG(1, (TEXT("1234567!\r\n")));

    }

    其中DEF文件为

    LIBRARY      Radio2

    EXPORTS

         RadioInit

     

    EXE为静态MFC库,EXE涉及到驱动调用的部分为

    typedef void (WINAPI * FuncInit)(void); .h文件中

    BOOL CMultiPlatformDlg::OnInitDialog()

    {

         CDialog::OnInitDialog();

         SetIcon(m_hIcon, TRUE);         

         SetIcon(m_hIcon, FALSE);        

        AfxMessageBox(_T("Start to Load DLL!"));

         hDll = GetModuleHandle(_T("Radio2.dll"));

         if(hDll == NULL)

         {

          //hDll = LoadLibraryEx(_T("Radio2.dll") ,NULL ,DONT_RESOLVE_DLL_REFERENCES);

          //hDll = LoadLibraryEx(_T("\\Storage Card\\Radio2.dll") ,NULL ,LOAD_WITH_ALTERED_SEARCH_PATH);

          //hDll = LoadLibraryEx(_T("Radio2.dll") ,NULL ,LOAD_WITH_ALTERED_SEARCH_PATH);

          hDll = LoadLibraryEx(_T("Radio2.dll") ,NULL ,DONT_RESOLVE_DLL_REFERENCES);

          if(hDll == NULL)

          {

             DWORD ErrorCode = 0;

              ErrorCode = GetLastError();

              AfxMessageBox(_T("Cannt load library"));

              RETAILMSG(1,(TEXT( "ErrorCode IS 0x%x \n"), ErrorCode ));

          }

          else

          {

              hFuncInit = (FuncInit)::GetProcAddress(hDll ,_T("RadioInit"));

            if(hFuncInit)

            {   

                AfxMessageBox(_T("Start to Operate!"));

                hFuncInit();

            }

            else

              AfxMessageBox(_T("Cannt get address!!"));

          }

        }

         else

          AfxMessageBox(_T("hDll has existed in process")); 

         AfxMessageBox(_T("End to Load DLL!"));

         return TRUE; }

    问题出现了,如果将LoadLibraryEx更改为LoadLibrary,或者将最后一个参数改为LOAD_WITH_ALTERED_SEARCH_PATH或者0,那么系统始终找不到ModuleGetLastError()126,如果改为DONT_RESOLVE_DLL_REFERENCES,可以找到,但是一运行hFuncInit(),就会出现下面的错误。

    Prefetch Abort: Thread=8fac09e0 Proc=8d626430 'MultiPlatform.exe'

    AKY=00000021 PC=80000391(???+0x80000391) RA=01e51058(radio2.dll+0x00001058) BVA=80000391 FSR=00000005

    但是如果在驱动的导出函数里什么都不做(只有{}),就可以正常运行,但这不符合我的设计思路,我已经被这个问题困扰很多天了,请各位高手帮我分析下问题原因。

    我怀疑过可能是DllMain的问题,但是我的OnInitDialog返回的是true

     

    2009年12月17日 3:21

答案

  • 再看完了你的帖子后,我感觉问题和疑惑特别多,我的建议如下,

    1 WINCE的驱动是DLL,但是不应该使用LoadLibrary函数来添加

    注释,不知道你描述的驱动是否和CE驱动不同(不应该使用常规DLL共享MFC库吧,难道有特别原因).

    2 建议永远不要使用DONT_RESOLVE_DLL_REFERENCES这个值,它的存在仅仅是为了向后兼容 ,

          请查看http://blogs.msdn.com/oldnewthing/archive/2005/02/14/372266.aspx

    3 按你的描述,"驱动的导出函数里什么都不做(只有{}),就可以正常运行" ,显然是问题出在你的内部实现代码上,CE60开始已经有了内核态和用户态的区分,你仔细查查你的DLL驱动代码,肯定可以找到原因.


    广交CE高手,共断疑难杂症 :)
    2009年12月21日 9:42