Een Loop maar hoe?

Status
Niet open voor verdere reacties.

Redapple

Nieuwe gebruiker
Lid geworden
3 feb 2007
Berichten
2
Hallo iedereen,

Ik ben al enige tijd bezig met wat C++ console dingen - Nu heb ik de volgende functie gemaakt (Eigenlijk een beetje te grote functie)

Code:
bool registerDll(const char *filename)
    {
    HINSTANCE hInst = LoadLibrary(filename);
    if (!hInst)
        {
        return false;
    }
    else
        {
        	HRESULT (FAR STDAPICALLTYPE * lpDllEntryPoint)(void); 
        (FARPROC&)lpDllEntryPoint = GetProcAddress(hInst, "DllRegisterServer");
        if (!lpDllEntryPoint)
            {
            return false;
        }
        else
            {
            	 HRESULT hr = (*lpDllEntryPoint)(); 
            if (hr)
                {
                return false;
            }
        }
        FreeLibrary(hInst);
    }
    return true;
}

Goed nu roep ik die functie op deze manier op:

registerDll("bestand1.dll");
registerDll("bestand2.dll");
registerDll("bestand3.dll");
registerDll("bestand4.ax");
registerDll("bestand5.ocx");

Zo gaat dat nog wel even door tot een regel of honderd.

Is het mogelijk om het volgende te doen ( Ik ben namelijk ook niet zo een pro in C++ )

- Een loop te maken (Ik weet zelf niet hoe) Dit is een voorbeeld.
registerDll("
bestand1.dll,
bestand2.dll,
bestand3.dll,
bestand4.ax,
bestand5.ocx,
");

Nu heb ik ook hier in de functie het volgende gemaakt:
Code:
        FreeLibrary(hInst);
    }
    return true;

Hoe kan ik het resultaat echo'en?

Dank je wel alvast voor je reply .

 
Dat van die loop lijkt me niet zo'n goed idee. Wat levert het op?

Resultaat echo'en?

Iets als dit?
cout << registerDLL("naam") ? "Gelukt.\n" : "Niet gelukt.\n"
 
Dat van die loop lijkt me niet zo'n goed idee. Wat levert het op?
Leesbare code ?

Ik zou de namen van al je dll's die je wil registreren in een array zetten, en dan kan je over de array loop'en voor de functie registerDLL. De functie blijft dus onveranderd.

conceptcode (ter plaatse uit m'n duim gezogen):
Code:
#include <string> //voor c_str();

const unsigned int aantal_dll = 5; //vervang dit getal door je aantal dll's
//de array met alle namen
string elke_dll[aantal_dll] = { "bestand1.dll", "bestand2.dll", "bestand3.dll", "bestand4.ax", "bestand5.ocx" }; //aan te vullen met alle namen

//elke dll registreren via de functie registerDLL en het resultaat weergeven
cout << "DLL\'s registreren:" << endl;
for (unsigned int i = 0; i < aantal_dll; i++) {
        //huidige dll weergeven
        cout << elke_dll[i] << "... ";
        //effectieve registratie
        if (registerDLL(elke_dll[i].c_str()) ) 
                cout << "done";    //gelukt
        else
                cout << "failed";    //mislukt
        //volgende lijn
        cout << endl;
}
cout << "--- einde registratie DLL's ---" << endl;

--Johan
 
of om je code nog leesbaarder te hebben zet je de namen van je dll's in een aparte textfile.

dll.txt
Code:
 bestand1.dll
bestand2.dll
bestand3.dll
bestand4.ax
bestand5.ocx

en jij krijgt dan volgende extra functie (nog steeds uit de duim gezogen):
Code:
#include <fstream> //voor inlezen van de file
#include <string> //voor c_str()
#include <iostream>
using namespace std;

void registerAllDll()
{
        cout << "--- Registering dll's ---" << endl;
        //open de file
        ifstream dll_file ("dll.txt");
        if ( dll_file.is_open() ) { //file is open
                string currDLL; //opslaan van huidige dllnaam
                //zolang er lijnen in de file zijn
                while (! dll_file.eof() ) {
                        //lijn ophalen
                        getline(dll_file, currDLL);
                        //weergave
                        cout << "Registering " << currDLL << " ... ";
                        //proberen registreren
                        if (registerDLL(currDLL.c_str()) )
                                cout << "done"; //gelukt
                        else
                                cout << "failed"; //mislukt
                        cout << endl;
                }
                //file sluiten
                dll_file.close();
        } else
                cout << "File could not be opened!" << endl;
        cout << "--- End of DLL-Registration ---" << endl;
}

die kan je dan vanuit je main aanroepen en alle dll's worden geregistreerd volgens je registreerDLL-functie !


--Johan
 
Dank je wel allemaal

Ik gebruik toch liever de eerste code die je me gaf maar daar komt nu een error in voor, Ik heb gebprobeer de debuggen maar zonder success

C:\test.cpp(95) : error C2065: 'registerDLL' : undeclared identifier

if (registerDLL(elke_dll.c_str()) )

Wat kan ik doen?
 
Laatst bewerkt:
die regel zegt dat, op die regel de functie registerDLL nog niet gekend is.

Wat bij nader inzien wel duidelijk is, want jouw functie noemt registerDll (kleine 'l'). Even aanpassen dus ;)

--Johan
 
Als je het mij vraagt bestaat wat je maakt al:
regsvr32.exe van windows, die kan je in een installer aanroepen
overigens:
PHP:
TCHAR* strDllNames[] =
{
 TEXT("dll1.dll"),
 TEXT("dll2.dll")
};

for(int c = 0; c < sizeof(strDllNames) / sizeof(TCHAR*); c++)
 cout << strDllNames[c] << endl;

[\PHP]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan