WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Visual C++ 2005 Express (http://www.wcm.at/forum/showthread.php?t=211519)

delphirocks 09.03.2007 20:13

Du kannst das Programm mal posten wenn du willst, dann probier' ich's mal bei mir aus.

stz 10.03.2007 08:36

@delphirocks:
Bitte um Deine Emailadresse per PN.
Danke
Stz.

Biri 10.03.2007 10:27

@stz: (das ist nicht dein richtiger name, oder?) - wie bereits geschrieben, ich würde dir auch anbieten, es zu testen - wie du willst.

Kannst es als .zip hier einfügen, oder falls du das nicht möchtest, mir als PM schicken.

fg
hannes

Biri 11.03.2007 13:53

Hallo Heinz,

Ich antworte in diesem Fall nicht via PM, sondern direkt hier im Forum, damit andere, welche ähnliche bzw. das selbe Problem haben ggf. davon profitieren können.

Ich konnte nach einigen Problemen dein Programm ausführen - aber alles der Reihe nach...

Gleich nach dem Starten wurde die Fehlermeldung:

Activation context generation failed for "C:\wcm_prog\Memo2005.exe". Dependent Assembly Microsoft.VC80.CRT,processorArchitecture="x86",pub licKeyToken="1fc8b3b9a1e18e3b",type="win32",versio n="8.0.50727.762" could not be found. Please use sxstrace.exe for detailed diagnosis.

ins Eventlog eingetragen.

Eine Suche in Google brachte keine Lösung, nur den Hinweis (auf http://forums.microsoft.com/MSDN/Sho...20178&SiteID=1), man solle doch folgendes machen:

Copy *80.dll and *80d.dll files in Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86\Microsoft.VC80.Deb ugCRT to someplace where your debug exe can see them.

Das hab ich dann gemacht, also folgende Dateien in das Programmverzeichnis kopiert:

Microsoft.VC80.CRT.manifest
msvcm80.dll
msvcp80.dll
msvcr80.dll

Nach einem weiteren Programmstart wurde nun folgende Fehlermldung ins Eventlog eingetragen:

Activation context generation failed for "C:\wcm_prog\Memo2005.exe".Error in manifest or policy file "C:\wcm_prog\Microsoft.VC80.CRT.MANIFEST" on line 11. Component identity found in manifest does not match the identity of the component requested. Reference is Microsoft.VC80.CRT,processorArchitecture="x86",pub licKeyToken="1fc8b3b9a1e18e3b",type="win32",versio n="8.0.50727.762". Definition is Microsoft.VC80.CRT,processorArchitecture="x86",pub licKeyToken="1fc8b3b9a1e18e3b",type="win32",versio n="8.0.50608.0". Please use sxstrace.exe for detailed diagnosis.

Ursache dafür ist die sog. Side by Side Execution. Um die "Dll Hell" zu lösen bzw. zumindest zu entschärfen,
wurde von MS das Modell entwickelt, dass eine Applikation fix mit einer bestimmten Version einer Dll verbunden werden kann. Das verhindert das Problem, das nach dem Update der Dll durch eine neuere Version plötzlich Programme nicht mehr
funkionieren, weil sich im Code der Dll etwas geändert hat. => Das war die sog. "Dll Hell" ;)

Der Update einer Dll war somit immer potentiell gefährlich, weil man nie wusste, ob bisherige Programme mit der neuen Version der Dll funktionieren - deshalb konnte man nun ein Assembly Manifest erstellen, in welchem festgelegt wurde,
dass das Programm FIX eine bestimmte Version der Dll benötigt. (Man kann auch festlegen, dass automatisch neuere Versionen verwendet werden soll u.a.)

Na jedenfalls hab ich mir's dann einfach gemacht und das Manifest geändert (da ich die angeforderte Version
8.0.50608.0 nicht habe).

Inhalt der geänderten Manifest Datei:

PHP-Code:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable/>
    <assemblyIdentity 
        type="win32" 
        name="Microsoft.VC80.CRT" 
        version="8.0.50727.762" 
        processorArchitecture="x86" 
        publicKeyToken="1fc8b3b9a1e18e3b"
    />
    <file name="msvcr80.dll"/>
    <file name="msvcp80.dll"/>
    <file name="msvcm80.dll"/>
</assembly>

Ich hab also nur den Einrag von
version="8.0.50608.0"
auf
version="8.0.50727.762"
geändert.

Nach den Start des Programmes wird eine MessageBox mit der Meldung:
"Morgen am 12.3.2007: Test."
ausgegeben.

hoffe, das hilft dir + fg
Hannes

stz 11.03.2007 17:28

@Biri
Alle Achtung, das hätte ich wohl nie herausgefunden. So sollte es auch funktionieren.
Aber leider funktioniert es bei mir noch immer nicht. Ich habe die 3 DLLs sowie Deinen Text für ein Manifestfile in ein solches geschrieben mit dem angegebenen Namen. Auf meinem PC habe ich ein File mit diesem Namen nicht gefunden.
Das ganze auf einem System ohne VS2005-Installation.
Ergebnis: Wieder die Fehlermeldung mit dem Text "...kann nicht initialisiert werden.".
Dann habe ich dieses Verzeichnis auf meinen Laptop mit dem Internetzugang kopiert (mit diesen Dateien). Dort ist eine WinXP-Home-Instalation. Die Fehlermeldung lautete dann (siehe Bild).
Es wir anscheinend ein Framework V2 benötigt, das im WinXP Professional enthalten ist.
Ich hätte das Programm gerne portierbar gemacht auch auf PC's ohne Framework.
Hier gibt es mit den VS2005 anscheinend neue Regeln. Bei VS6.0 war das noch einfach. Da konnte mann die DLLs statisch ins Programm dazu linken und das Programm war einfach durch kopieren portierbar. Das statische dazulinken schein auch im VS2005 möglich zu sein, lt. Hilfe, aber ich konnte die Einstellungen dazu nicht finden.
Hast Du noch neue Ideen wie man das bewerkstelliegen könnte?

Biri 11.03.2007 19:08

Hallo,

Diese Fehlermeldung sagt aus, dass dein Programm das .net Framework 2.0 verwenden möchte, auf dem PC auf dem es gestartet wurde aber nicht finden kann.

Das .net Framework wurde von Microsoft entwickelt, um die Windows Programmierung zu vereinfachen (imho. erfolgreich). Es bildet einen objektorientierten Layer über die Win API, geht dabei aber viel weiter wie z.B. MFC oder ATL.
.net ist keine Programmiersprache, sondern definiert eine Infrastruktur, welche von einer .net Sprache erfüllt werden muss (z.B. C#, VB.NET) - Der Compiler von .net Sprachen erzeugt IL Code (intermediate Language) usw. usw. - ein umfangreiches Thema das ich hier jetzt nicht in allen Details erläutern kann.

Jedenfalls KANNST du in deinem mit Visual Studio 2005 erstellten Programm die .net Runtime verwenden (.net Runtime sind in Wahrheit einige Dll's - diese werden unter .net als Assemblies bezeichnet - sie enthalten im Gegensatz zu "normalen" Dlls auch noch Metadaten).
Wenn du diese .net Runtime verwendest, muss auf dem PC auf welchem das Programm installiert wird dann auch die .net Runtime (= das .net Framework) installiert werden.

Beim XP SP2 war .net dabei, allerdings nicht die Version 2.0 - diese ist nur bei Windows Vista von haus aus mitinstalliert.

Du hast also die Möglichkeiten:
- Auf allen PC's die dein Programm verwenden möchten die .net Runtime zu installieren
- In deinem Programm die .net Runtime nicht zu verwenden und C++ Programme "wie bisher" zu schreiben.

Ich tendiere zu Möglichkeit 1, weil es das Programmieren enorm vereinfacht, es kommt aber immer auf deinen Anwendungsfall an.
Wenn du die .net Runtime nicht benötigst oder du weißt, dass sie auf den PCs deiner Kunden (warum auch immer) nicht installiert wird, musst du ohne dieser auskommen.

Du musst dann halt im Visual Studio den entsprechenden Projekttypen auswählen - also z.B. Other Languages - C++ - ATL/MFC/Win32


Zitat:

Es wir anscheinend ein Framework V2 benötigt, das im WinXP Professional enthalten ist.
Nein, .net Framework 2.0 ist auch in Windows XP nicht enthalten, wird aber über die Windows Updates installiert, wenn man das zulässt. Erst bei Vista ist es fix dabei.

Zitat:

Ich hätte das Programm gerne portierbar gemacht auch auf PC's ohne Framework.
Wenn das wirklich sein muss, darfst du in einem Programm keinen Funktionen des Frameworks verwenden. Also Projekttyp MFC/ATL/Win32

Zitat:

Hier gibt es mit den VS2005 anscheinend neue Regeln. Bei VS6.0 war das noch einfach. Da konnte mann die DLLs statisch ins Programm dazu linken und das Programm war einfach durch kopieren portierbar.
Ja, es haben sich einige Dinge geändert imho. aber zum Positiven - zu Zeiten von VS 6.0 gab es noch kein .net Framework, da durfte man sich mit MFC herumärgern - das war viiieeeell schlimmer. (Dll Hell !)

Das Deployment wurde unter .net stark vereinfacht - suche mal nach "Click once deployment", ev. wäre das was für dein Programm. Dabei wird ein Setup erstellt welches Prüft, ob es am PC auf dem installiert wird bereits das .net Framework gibt und dieses ggf. installiert. Man kann es dann auch so konfigurieren, dass automatisch auf einem Server nachgeschaut wird, ob es eine neue Programmversion gibt, welche dann beim Start des Programmes automatisch zum Client übertragen wird u.v.a.

In einem Punkt geb ich dir aber recht: Seit VC 6.0 hat sich einiges getan.

fg
hannes

stz 16.03.2007 08:34

VC++ 2005 Express
 
Hallo Helferleins!
Weiss den niemand wie man ein, mit diesem Tool erzeugtes Programm auf andere PCs portieren kann? Am besten durch einfaches Kopieren, oder auch mit entsprechenden Redistributionsets. Das eine Redistributionset, das es bei MiSoft gibt reicht nicht ganz.
Oder ist die Gratisversion "Visual Studio 2005 Express" so eingeschränkt, dass ein Portieren verhindert wird? Wer weiss etwas darüber? Oder wer kennt eine Lösung für dieses Problem?
Viele Dank.
Stz.

Biri 16.03.2007 09:39

hi,

wo liegt denn nun das Problem?
Ich hab ja genau das gemacht - hab mir dein Programm auf meinen Rechner kopiert, zum laufen gebracht und beschrieben, wie es geht.
Also quasi ein XCopy Deployment.

Man könnte auch ein Setup Projekt erstellen - wobei ich hier nicht weiß, ob das mit Visual Studio Express funktioniert (Mit Standard Edtion geht das).

fg
hannes

delphirocks 16.03.2007 23:39

Mein ernstgemeinter Rat wäre:
Nimm Delphi oder den C++ Builder.

Gibt's beide in einer Gratisversion.
Beide sind zwar aufgrund der .NET und MSXML Prerequisites etwas mühsam zu installieren, aber wenigstens kannst du deine Sachen in eine einfache EXE packen, ohne irgendwelche Dependencies außer der kernel32.dll und vielleicht noch gdi32.dll).

Dein kleines Programm wird dann zwar relativ groß (so ca. 300KB schätze ich mal ;)), aber das dürfte aus heutiger Sicht wahrscheinlich eher egal sein, wenn man bedenkt, was diverse Java und .NET Runtimes an Festplattenspeicher verbraten.

Wenn du dann noch einen Exe Packer wie UPX dazu gibst, wird's noch kleiner (ca. um die Hälfte).

Und laufen tut's auf Win95-Vista.


stz 17.03.2007 09:55

@Biri.
Versuche mal das Programm auf einer WinXP-Installation ohne Framework und ohne VC++ 2005 (-Express), z.B. WinXP-Home laufen zu lassen. Genau das aber sollte bei einem portierbaren Programm funktionieren. Auch unter z.B. Windows 95/98. Wie gesagt, am besten durch einfaches Kopieren. Oder wenn nicht anders geht zumindest durch ein Resdistributionset oder eine Setup-Installation. Letztere kann man bei Visual Basic, sowohl V6 als auch 2005 Express erstellen, nicht aber für VC++, weder V6 noch 2005 Express.
Ein Programm, das man nicht auf andere PCs portieren kann ist doch wohl ziemlich sinnlos.

@delphirocks
Der C++ Builder ist doch wohl VC++ V6.0, oder?
Damit funktioniert auch das Einbinden der notwendigen DLL's. Damit kann das Programm einfach auf andere PCs kopiert werden, und läuft auch unter Win95 bis -XP (Vista habe und kenne ich noch nicht). Ich möchte das aber auch mit VC++ 2005 Express erreichen (lernen). Nur wie?

M.f.G
Stz.


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag