Nous avons une bibliothèque 32 bits écrite et compilée dans Borland Delphi. Cette bibliothèque est référencée par divers autres projets, y compris un service Web WCF hébergé dans IIS. Le service Web est compilé à l'aide de l'option x86 et tout fonctionne correctement sur une machine 32 bits. Cependant, sur notre serveur 64 bits, le service échoue lors de l'appel dans la bibliothèque Delphi 32 bits. Certains de nos clients ont même des problèmes avec les formulaires .NET 32 bits appelant dans la bibliothèque sur une machine 64 bits; bien que nous n'avons pas été en mesure de reproduire ce problème particulier. Donc, quelqu'un sait-il pourquoi le code .NET compilé avec l'option 32 bits échouerait tout en appelant une bibliothèque 32 bits non .NET sur une machine 64 bits?Quelles sont les raisons non évidentes pour lesquelles une application 32 bits échouerait sur une machine 64 bits?
Répondre
Eh bien, juste une conjecture sauvage :)
Avez-vous plus d'un processus d'interaction ?. Ces processus essaient-ils d'écrire/lire dans des dossiers protégés (par exemple% PROGRAMFILES%,% WINDIR%)? (par exemple, est-ce que ces processus utilisent des fichiers dans des dossiers tels que IPC?)
Depuis Windows 64 bits redirige les écritures vers ces dossiers pour les applications 32 bits (sur une base par utilisateur) si les processus fonctionnent avec des informations d'identification d'utilisateur différentes. les processus peuvent ne pas trouver un fichier créé par l'autre processus.
est en fait juste une bibliothèque pour crypter/décrypter une chaîne. nous lui passons une chaîne/combo de touches et il retourne une autre chaîne. J'apprécie vos pensées, cependant. nous n'avons pas la moindre idée de la nôtre ... – Jennifer
Je suppose que vous définissez le point d'entrée de la méthode sur le côté .NET quelque chose comme ça?
internal static class Delphi
{
[DllImport("delphi32bitlibrary.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool Encrypt(
IntPtr parameter1,
string parameter2,
out string parameter3);
}
puis vous l'appelez quelque part d'une manière similaire?
string encryptedString;
Delphi.Encrypt(IntPtr.Zero, "test", out encryptedString);
Si tel est le cas (votre kilométrage peut varier dans la mise en œuvre effective), pouvez-vous réécrire comme tel:
string encryptedString;
try
{
Delphi.Encrypt(IntPtr.Zero, "test", out encryptedString);
}
catch (Exception ex)
{
EventLog log = new EventLog();
log.WriteEntry(ex.Message + "\n" + ex.StackTrace, EventLogEntryType.Error);
}
Cela devrait mettre à l'épreuve de l'ordinateur se connecter une explication détaillée de ce arrivé lorsque la pièce de 32 bits a été appelée. De là, vous (et peut-être nous) pouvez obtenir de bonnes preuves de ce qui peut échouer.
Heap corruption! Apparemment, il existe un indicateur appelé HeapEnableTerminationOnCorruption qui n'était pas précédemment activé par défaut. En tant que nouvelle fonctionnalité de Windows Vista, le processus de travail IIS se termine lorsque la corruption du tas est détectée. Ainsi, il ne s'est avéré que fonctionner dans nos applications autonomes et sur nos machines Windows XP 32 bits, alors qu'en réalité, il ignorait tout simplement l'erreur.
Pour résoudre ce problème, nous avons modifié notre code d'appel dans les bibliothèques Delphi pour utiliser IntPtrs et retransmettre les données en utilisant les paramètres out. Par exemple:
public string CallDLL(string sTest)
{
string s = "";
IntPtr p1 = Marshal.StringToHGlobalAnsi(sTest);
s = Marshal.PtrToStringAnsi(p1);
if (p1 != IntPtr.Zero)
{
Class1.TestDLL(out p1);
s = Marshal.PtrToStringAnsi(p1);
}
Marshal.FreeCoTaskMem(p1);
return s;
}
Espérons que cela aide n'importe qui avec le même problème.
- 1. Comment les maths 64 bits sont-ils exécutés sur une machine 32 bits?
- 2. Quelles sont les directives pour le portage d'un programme 32 bits vers une version 64 bits
- 3. Machine ASP.NET 32 bits compilée en cours d'exécution sur une machine 64 bits
- 4. Quelles sont les raisons les plus probables pour lesquelles une application échouerait sur un seul de mes serveurs?
- 5. Exécution de l'application 32 bits à l'aide de com 32 bits sur une machine Windows 64 bits
- 6. Impossible d'exécuter les applications 32 bits sur Linux 64 bits
- 7. Comment comprendre pourquoi l'application .NET s'exécute en 32 bits sur une machine 64 bits
- 8. L'application 32 bits ne trouve pas l'assemblage mshtml lors de l'exécution sur une machine 64 bits
- 9. java.lang.UnsatisfiedLinkError: Impossible de charger les bibliothèques SWT 64 bits sur une machine JVM 32 bits dans une machine Windows x86
- 10. Comment compiler un fichier binaire 32 bits sur une machine Linux 64 bits avec gcc/cmake
- 11. Des suggestions sur les raisons pour lesquelles une application .Net recherche un fichier de configuration différent sur une machine 64 bits?
- 12. long sur une machine 64 bits
- 13. Installation de Coldfusion 8 32 bits sur une machine 64 bits - des problèmes?
- 14. Limite d'allocation de mémoire pour une application 32 bits sur un système 64 bits
- 15. Xcode & 64 bits & 32 bits Question
- 16. Comment exécuter un VBScript en mode 32 bits sur une machine 64 bits?
- 17. Forcer un service Windows .NET à s'exécuter en 32 bits sur une machine 64 bits
- 18. directive C# pour indiquer 32 bits ou 64 bits construire
- 19. Exécution d'une application Web 32/64 bits
- 20. Déplacement d'une application de 32 bits à 64 bits
- 21. Comment enregistrer une DLL 64 bits (sur un système d'exploitation 64 bits) à partir d'une application 32 bits
- 22. Application java 64 bits à utiliser 32 bits dll
- 23. Traiter le code 32 bits sur Snow Leopard 64 bits?
- 24. Est-il possible d'utiliser un pilote ODBC 32 bits avec une application 64 bits sur Windows?
- 25. L'iPhone OS 64 bits ou 32 bits?
- 26. Comment exécuter une application .NET 32 bits sur un serveur Windows 64 bits?
- 27. Déploiement d'objets COM 32 et 64 bits sur une machine 64 bits à partir d'un projet d'installation VS MSI
- 28. Création d'un wrapper géré pour les DLL non gérées 32 bits et 64 bits
- 29. Solr - utilise Java 64 bits, pas Java 32 bits sous Windows 7 64 bits
- 30. Sérialisation binaire .NET entre OS 32 bits et 64 bits
Quelle est la nature de l'échec? Exception avec trace de pile ou code de retour défaillant, etc. –
Salut Jesse, merci pour la réponse. Fondamentalement, le service ne fonctionne plus et werfault.exe * 32 apparaît dans le gestionnaire de tâches. – Jennifer