Win32-DLL als reine Ressource -> Fehlermeldung



  • Guten Abend,

    aus einem alten Computerspiel ist mir bekannt, dass DLLs auch zum Speichern von z.B. Zeichenketten genutzt werden können. Ich bin hier auf eine Anleitung gestoßen:
    https://docs.microsoft.com/de-de/cpp/build/creating-a-resource-only-dll?view=vs-2019

    Ich habe ein leeres Win32-Projekt DLL ohne MFC und alles erstellt. Habe Rechtsklick auf das Projekt und und versucht eine neue Ressource hinzuzufügen. In meinem Fall eine StringTable und habe zwei Teststrings hinzugefügt. Anschließend unter Linkeroptionen /NOENTRY eingestellt, gespeichert und versucht das Projekt zu erstellen. Es werden zwei Fehlermeldungen ausgespuckt:
    LNK2001: Nicht aufgelöstes externes Symbol "__DllMainCRTStartup@12"
    und
    LNK1120: 1 nicht aufgelöste Externe

    Weiter weiß ich allerdings nicht das Problem zu beheben. Ich habe schon Google durchforstet sowie YouTube. Vielleicht weiß jemand eine Lösung, würde mich sehr freuen.

    Mit besten Grüßen,

    Jan

    PS: Ich arbeite mit dem Visual Studio 2017



  • Enthält das Projekt noch irgendwelche .h, .c oder .cpp Dateien? Wenn ja, entferne die alle.



  • Also es war eine automatisch generierte resource.h Datei erzeugt worden mit der .rc-Datei. Ich habe diese gelöscht. Selbiges Problem.

    Der Inhalt war

    //{{NO_DEPENDENCIES}}
    // Microsoft Visual C++ generated include file.
    // Used by Testresource.rc
    
    // Nächste Standardwerte für neue Objekte
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        101
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1001
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    

    Ich habe zudem ein neues Projekt erstellt alles gleich bis auf bei der Projektvorlage habe ich Symbole exportieren angegeben. Ebenfalls gleiche Fehlermeldung



  • Bist du sicher dass du /NOENTRY eingestellt hast? Oder hast du /NOENTRY vielleicht für die Release Config eingestellt und bauen tust du Debug (bzw. umgekehrt)?

    ps: Die resource.h kann (und sollte) bleiben. Überhaupt sollten .h nicht stören. Ich dachte mir nur ... sicherheitshalber testweise auch mal die entfernen kann nicht schaden 🙂



  • Ich habe nun mal das Projekt wo noch die resource.h drin ist zur Hand genommen. Ich habe unter Projekt -> Eigenschaften
    bei Konfigurationen: Alle Konfigurationen und bei Plattformen: Alle Plattformen eingestellt. Nun geht es ohne Fehlermeldungen. Mit dem Flag /NOENTRY

    Ich denke du warst auf der richtigen Fährte mit dem Problem vielen Dank dafür 🙂 Allerdings hab ich nur das Flag eingestellt und sonst an keinen Einstellungen rumgefuscht. Ich hab Release normalerweise nie drin in meinen Projekten.

    PS: ich habe spaßeshalber mal sichergestellt dass nun überall Debug steht und es geht, ich denke ich werde den selben Effekt erzielen wenn überall Release steht^^

    Ich habe nun nochmal ein anderes Projekt genommen. Wenn ich beim ersten versuch das Projekt zu erstellen auf Debug oder Release gehe funktioniert es nicht. Anscheinend muss erstmal für "alle Konfigurationen" eingestellt sein.

    Ich habe mit den bisherigen Ergebnissen weitergearbeitet und eine Konsolenanwendung erstellt die den String "Hello World" aus der Ressourcen Dll ausgeben soll. Ich bin mir sicher dass es da ein paar Ungereimtheiten geben könnte

    #include <iostream>
    
    #include <Windows.h>
    
    int main(int argc, char** argv)
    {
    	HINSTANCE hDll = LoadLibrary(L"PROJECT4");
    	if (hDll != NULL) // this if is true and outputs "True" on console
    	{
    		std::cout << "True" << std::endl;
    		HRSRC find_source = FindResource(hDll, L"IDS_STRING101", L"RT_STRING");
    		if (find_source != NULL) // this if is false
    		{
    			std::cout << "True" << std::endl;
    			TCHAR input[50];
    			LoadStringW(hDll, 101, input, 50);
    			std::cout << input << std::endl; // Output should be "Hello World"
    		}
    		FreeLibrary(hDll);
    	}
    	return 0;
    }
    


  • @CAres91 sagte in Win32-DLL als reine Ressource -> Fehlermeldung:

    Ich hab Release normalerweise nie drin in meinen Projekten.
    PS: ich habe spaßeshalber mal sichergestellt dass nun überall Debug steht und es geht, ich denke ich werde den selben Effekt erzielen wenn überall Release steht^^

    Ich glaube daß Du eine etwas schräge Vorstellung davon hast was in einem Visual Studio Projekt "Release" und "Debug" bedeutet. Das sind einfach unterschiedliche Konfigurationen pro Projekt die verschiedene Buildeinstellungen haben können. In einem Debugbuild will man in der Regel keinen optimierten Code sondern eher Debuginformationen (Symbole) während man in einem Releasebuild entweder auf Geschwindigkeit oder auf Größe (möglichst klein) optimierten Code haben will. Wenn Du jetzt etwas an den Projekteigenschaften änderst musst Du darauf achten was oben im Projekteigenschaftenfensterchen ausgewählt ist an Configuration und Platform. All Configuration und All Platforms gilt dann auch für all configurations and platforms ^^. Wenn Du aber eine Option nur für Debug-Builds auswählst dann gilt diese Einstellung auch logischerweise nur für Debug-Builds.



  • Guten Abend, ich habe weiter an meinem Programm gewerkelt, es etwas verändert und nun bin ich fast zufrieden nur im Gegenwärtigen Zustand spuckt es mir: 00BCFBC0 anstatt Hello World aus. Zumindest bin ich einige Schritte weiter gekommen.

    Mache ich es über Indirektion wird 72 angezeigt. Also wenn ich *input ausgeben will

    #include <iostream>
    
    #include <Windows.h>
    
    int main(int argc, char** argv)
    {
    	HINSTANCE hDll = LoadLibrary(L"PROJECT4.dll");
    	if (hDll)
    	{
    		wchar_t input[25];
    		if (LoadStringW(hDll, 101, input, 50))
    		{
    			std::cout << input << std::endl;
    		}
    		FreeLibrary(hDll);
    	}
    	return 0;
    }
    


  • std::cout kann auch nichts mit wchar_t als string anfangen.
    für die ausgabe von wchar_t arrays als strings gibt es std::wcout



  • Hey cool danke es geht nun einwandfrei 🙂 War mein erster richtiger Kontakt mit dem Typ Daten.

    Mit besten Grüßen,

    Jan



  • @firefly sagte in Win32-DLL als reine Ressource -> Fehlermeldung:

    std::wcout

    Man kanns auch bleiben lassen weil die Windows-Konsole für unicode immer noch kaput ist.



  • @Swordfish sagte in Win32-DLL als reine Ressource -> Fehlermeldung:

    @firefly sagte in Win32-DLL als reine Ressource -> Fehlermeldung:

    std::wcout

    Man kanns auch bleiben lassen weil die Windows-Konsole für unicode immer noch kaput ist.

    Naja, ein bisschen UTF-8 kann man schon machen.


Log in to reply