2011-06-02 2 views
0

J'utilise ce code pour joindre un fichier en tant que ressource à un fichier exécutable:problème avec UpdateResource (Mémoire insuffisante)

interface 
type 
    TBuffer = Array [0 .. 0] of Byte; 
    PBuffer = ^TBuffer; 

Procedure AttachFile(); 
var 
    DataLength: DWord; 
    Data: PBuffer; 
begin 
    FS := TFileStream.Create(Filename, fmOpenRead); 
    try 
    FS.Seek(0, soFromBeginning); 
    DataLength := FS.Size; 
    GetMem(Data, DataLength); 
    FS.Read(Data^, DataLength); 
    finally 
     FS.Free; 
    end; 
    UpdateResource(ResourceHandle, RT_RCDATA, pchar('ResName'), 
    0, Data, DataLength); 
    EndUpdateResource(ResourceHandle, false); 
end; 

Le problème est que quand je veux joindre un Larg (1 Go par exemple) fichier en utilisant ce code, je vais recevoir cette erreur: Out of memory.

J'ai essayé aussi de diviser mon dossier à des parties plus petites (par exemple: 100 Mo) et le fixer à l'aide d'un for ring mais il ne fonctionne toujours pas et je reçois Out of memory

+2

Vous attachez une ressource de 1 Go. Pourquoi? Etes-vous sûr de savoir qui utilise une ressource pour stocker ce fichier plus volumineux est la bonne approche? – RRUZ

+0

J'ai également essayé de diviser mon fichier en parties plus petites (par exemple: 100MB) et de l'attacher en utilisant un 'pour ring' mais ça ne fonctionne toujours pas et je reçois Out of memory – Kermia

+0

Cela me semble étrangement une sorte de malware . Puis-je vous demander pourquoi vous devez joindre un fichier de 1 Go en tant que ressource? (Comme il est très improbable d'allouer un tampon mémoire de 1 Go avec un appel à GetMem avec tout ce qui fonctionne sur votre machine, même avec 4 Go de RAM, il est très improbable que vous puissiez accéder à une ressource de 1 Go sur une autre machine Cela m'a amené à croire que votre 'ressource' est quelque chose que vous essayez de vous faufiler sur l'autre machine sans être remarqué, ce qui me fait penser que vous ne faites rien de bon ...) –

Répondre

2

ressources intégrées ne sont pas destinés à soyez si grand et vous atteignez apparemment les limites.

Vous devez fournir ce fichier en tant que fichier autonome à côté de votre exécutable.

+0

S'il vous plaît aidez-moi à résoudre le problème. Comme je l'ai dit, je divise le gros fichier en parties plus petites, mais je reçois toujours «Mémoire insuffisante». donc le problème est autre chose. voulez-vous vérifier mon code et m'aider à le réparer? – Kermia

+1

la solution est de ne pas utiliser une ressource pour un tel fichier énorme –

+0

Très bien. Pourriez-vous me dire ce qui est «Out of memory»? – Kermia