Dialog aus dynamisch geladener DLL erzeugen (WinCE6)



  • Hallo Leute,

    ich möchte ein Dialog aus einer dynamisch geladener Dll erzeugen. Das ganze Funktioniert auf einer Win32 Platform einwandfrei:

    Kurzer einblick wie ich es gemacht habe (OnInitDialog):

    HINSTANCE _hInst = LoadLibrary(_T("Client.dll"));
    	
    if (_hInst == NULL)
    {
    	AfxMessageBox(_T("Failed to load DLL"));
    	return FALSE;
    }
    AfxSetResourceHandle(_hInst);
    
    
    #if defined (WINCE)
    	CreateClient CreateClientDel = (CreateClient)GetProcAddress(_hInst, _T("CreateClient"));
    #else
    	CreateClient CreateClientDel = (CreateClient)GetProcAddress(_hInst, "CreateClient");
    #endif
    	if (CreateClientDel == NULL) 
    	{
    		AfxMessageBox(_T("Failed to get function address"));
    		FreeLibrary(_hInst);
    		_hInst = NULL;
    		return FALSE;
    	}
    
    #if defined (WINCE)
    	GetDialogID GetDialogIDDel = (GetDialogID)GetProcAddress(_hInst, _T("GetDialogID"));
    #else
    	GetDialogID GetDialogIDDel = (GetDialogID)GetProcAddress(_hInst, "GetDialogID");
    #endif
    	
    if (GetDialogIDDel == NULL) 
    {
    	AfxMessageBox(_T("Failed to get function address"));
    	FreeLibrary(_hInst);
    	_hInst = NULL;
    	return FALSE;
    }
    _pDlgClient = CreateClientDel(_pParent, this);
    
    UINT idd =GetDialogIDDel();
    if(!_pDlgClient->Create(idd, _pParent))
    {
    	DWORD dwError = GetLastError();
    	TCHAR szError[256];
    	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, 0, szError, 256, NULL);
    	AfxMessageBox(szError);
    	AfxMessageBox(_T("Create error "));
    	return FALSE;
    }
    
    _pDlgClient->ShowWindow(SW_SHOW);
    
    return TRUE;
    

    die Dialog Ressourcen aus der dll werden auch durch die DllMain werden auch verknüpft:

    static AFX_EXTENSION_MODULE Lib_CDLL = { NULL, NULL };
    
    extern "C" BOOL APIENTRY DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    ....
    new CDynLinkLibrary(Lib_CDLL); //<--
    ...
    }
    

    wenn ich nun das ganze in winCE kompiliere, gibt "_pDlgClient->Create" liefert FALSE. Aber es gibt kein fehler code "Operation successfully completed ", und es wird nichts angezeigt... suspekt.

    Habe ich was vergessen oder was könnte ich noch probieren!?



  • Was ist denn der return Type von _pDlgClient->Create? Üblicherweise geben WinAPI Funktionen doch HRESULT zurück, für die der Wert 0 success bedeutet.
    Diese Return-Werte werden dann üblicher Weise auch nicht direkt als boolean behandelt, sondern mittels FAILED bzw. SUCCEEDED Makros abgefragt.
    Aber vll liege ich hier auch komplett falsch.



  • @DNKpp sagte in Dialog aus dynamisch geladener DLL erzeugen (WinCE6):

    Was ist denn der return Type von _pDlgClient->Create? Üblicherweise geben WinAPI Funktionen doch HRESULT zurück, für die der Wert 0 success bedeutet.
    Diese Return-Werte werden dann üblicher Weise auch nicht direkt als boolean behandelt, sondern mittels FAILED bzw. SUCCEEDED Makros abgefragt.
    Aber vll liege ich hier auch komplett falsch.

    Servus . Der Return value ist ein BOOL. Wenn FALSE geliefert wird, kann man ja mit GetLastError den fehler/Grund herausfinden. Allerdings ist dieser 0 also "eigentlich" kein fehler, aber Create liefert trotzdem FALSE.

    Wird vermutlich in MFC etwas anders als in der WinAPI gehandelt.



  • Da du scheinbar irgendwelche funktion-Pointer ansprichst, ist das für mich schwierig genau nachzuvollziehen.
    GetLastError sagt folgendes:

    The Return Value section of the documentation for each function that sets the last-error code notes the conditions under which the function sets the last-error code. Most functions that set the thread's last-error code set it when they fail. However, some functions also set the last-error code when they succeed. If the function is not documented to set the last-error code, the value returned by this function is simply the most recent last-error code to have been set; some functions set the last-error code to 0 on success and others do not.

    Allerdings sagt CDialog::Create nichts darüber aus, ob sie einen Error-Code setzt oder nicht. Ich würde daher davon ausgehen, dass sie es nicht tut.

    Aber ich bin in diesem Thema auch nicht wirklich drin. Gut möglich, dass ich etwas falsch verstehe.



  • @DNKpp sagte in Dialog aus dynamisch geladener DLL erzeugen (WinCE6):

    Allerdings sagt CDialog::Create nichts darüber aus, ob sie einen Error-Code setzt oder nicht. Ich würde daher davon ausgehen, dass sie es nicht tut.

    Erstmal Danke für dein Feedback. Laut Google kann ich mit "GetLastError" die fehler detail bei "Create" auslesen, habe auch schon bewußt fehler provoziert um zu schaun ob da was sinnvolles kommt.

    @DNKpp sagte in Dialog aus dynamisch geladener DLL erzeugen (WinCE6):

    Da du scheinbar irgendwelche funktion-Pointer ansprichst, ist das für mich schwierig genau nachzuvollziehen.

    hinter den func-ptr sind eben die die externen dll api funktionen, also die instanzierung des in der dll verpackten Dialoges.

    CDialog* CreateClient(CWnd* pParent)
     {
    	 CDialog * _pDepolyDlg = new CTestDlg();
    
    	return _pDepolyDlg;
     }
    
    void DestroyClient(CDialog* pDlgClient)
    {
    	delete pDlgClient;
    }
    
    UINT GetDialogID()
    {
    	return CTestDlg::IDD;
    }
    

Anmelden zum Antworten