C'est exactement ça ...
Mon gros souci est qu'etant donné que je passe la donnée que je récupère dans ma dll en c++ a un webservice en c sharp, j'ai besoin de sérialiser le flux. Quand je traite le blob (qui est bien entier dans la base) avec la fonction Read, je n'ai pas le blob en entier mais je l'ai tronqué (jusqu'au caractère NUL).
Le blob est récupéré entier. C'est la fonction qui fait le traitement qui bloque au premier caractère NUL venu et qui donc du coup créé un pdf tronqué.
[EDIT] cette question dépend de la lib [EDIT]
Ben tu doit spécifier dans ta fonction que ce que tu récuper est binaire et non en text. C'est comme lire une image bmp avec notepad.
Regarde ou tu peut spécifier cela.
Sinon dit quel lib tu utilise, ou mieux, le bout de code qui récupère le pdf dans le blob
je viens de trouver cela.
http://download-uk.oracle.com/docs/c...9/o4c00352.htm
Je te remercie mongaulois. J'avais déja vu cette page. Il faut maintenant que j'arrive a mettre cela en application et a l'intégrer a mon code.
Comme tu le disais, tout réside dans le fait de spécifier a ma fonction que je recupère bien un binaire et non un fichier texte tout simple.
Bonjour
Lorsque j'utilise le code fourni dans la page plus haut, l'appel a la fonction setmode ne passe pas. J'suis vraiment en galère la, je sais pas ce qui se passe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 result = ((ServerOra::CRecOra*)recObject)->GetBlob(CFACTURE_PAYEUR_BLOB); //m_Facture_Blob.append(result.f); OStartup(); unsigned char *buffer = 0; fstream fs;
Désolé Mongaulois, je ne sais pas comment faire pour savoir de quelle lib il s'agit mais il y a de tout façon de grande chance pour qu'il s'agisse de celle ci.
Quant à l'appel a la fonction open que tu donnes, mon souci provient du fait également que je n'ai pas de fichier "partout.bmp". (je n'ai aucun fichier a vrai dire juste un "flux pdf" - mon blob - en base)
Je croit que tu te mélange les pinceaux. Voici le code adaptéà utiliser aprés avoir récupérer result. Tu ne devrait pas trop avoir de problème à le compiler.
Tu pourrai ainsi vérifier que tu récupère bien le fichier PDF
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 std::ofstream f; f.open("c:/essai.pdf",std::ios::binary); unsigned long size = result.GetSize(); // calcul de la taille du buffertemporaire optimale unsigned long optchunk = result.GetOptimumChunkSize(); unsigned int bufsize = ((int)(32768/optchunk)) *optchunk; if (bufsize > size) bufsize = size; unsigned char *bufferTmp = new unsigned char[bufsize]; result.EnableStreaming(size); short status= OLOB_NEED_DATA; unsigned long NbLue=0; while(status == OLOB_NEED_DATA) { NbLue= result.Read(&status, bufferTmp , bufsize); f.write(buffer, NbLue); } result.DisableStreaming(); delete [] bufferTmp ; f.close();
Toujours un hic, j'espère que je ne vais pas finir par vous fatiguer mais le problème c'est que je ne veux pas créer de fichier pdf.
Je voudrais repasser mon flux blob (et le récupérer entièrement) pour le repasser a mon webservice. Mon webservice sera attaqué par mon php qui récupèrera le flux ENTIER et l'ouvrira a l'internaute.
je suis désésperé. Je bloque dans ton code au
ca me met :
Code : Sélectionner tout - Visualiser dans une fenêtre à part unsigned long size = result.GetSize();
Désolé le c++ c'est vraiment pas mon truc
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.Runtime.InteropServices.SEHException: External component has thrown an exception.
oui excuse moi, ca me met ça a l'exécution
je l'ai viré. Tu penses que je devrai le mettre ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 CODE_RETOUR CFacturePayeur::FromRecordset(ServerGen::CRec* recObject){ TraceLogMetier(LOG_NIVEAU_DEBUG,LC_DEB_LOG,"FromRecordset"); OBlob result; unsigned char *szBlobBuffer[BLOB_SIZE]; CODE_RETOUR iRetour = CODE_RETOUR_ERREUR_RECORDSET; if (recObject != NULL ) { if (recObject->isEOF()== false ) { m_IdFacture = __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_FACTURE)); m_IdClient = __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_CLIENT)); m_Date = CErgString(recObject->GetErgString(CFACTURE_PAYEUR_DATE_FACTURE)); m_MontantTTC = __int32(recObject->GetLong(CFACTURE_PAYEUR_MONTANT_FACTURE)); m_Etat = Etat_facture(__int32(recObject->GetLong(CFACTURE_PAYEUR_ID_FACTURE))); m_CrdSerial = __int32(recObject->GetLong(CFACTURE_PAYEUR_CRD_SERIAL_CARTE)); m_IdTypeCarte = __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_TYPE_CARTE)); result = ((ServerOra::CRecOra*)recObject)->GetBlob(CFACTURE_PAYEUR_BLOB); std::ofstream f; f.open("c:/essai.pdf",std::ios::binary); unsigned long lSizertr = result.GetSize(); } iRetour = CODE_RETOUR_REUSSI; } TraceLogMetier(LOG_NIVEAU_DEBUG,LC_FIN_LOG,"FromRecordset"); return iRetour; }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager