Evolution du code qui ne change rien
Bonjour:)
J'ai fait des essais à tout hasard
le nouveau code est comme suit:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
try
{
CoUninitialize();
ErrorCode = CoInitialize(NULL);
if( ErrorCode == INIT_NO_ERROR)
{
m_pGlobalPtr = new TWordGlobal( NULL);
m_pWordApplication = new WORDVER::TWordApplication(NULL);
m_pWordApplication->InitServerData();
if( m_pWordApplication != NULL)
{
m_pApplicationPtr = m_pGlobalPtr->GetDefaultInterface();
m_pWordApplication->ConnectTo( m_pApplicationPtr);
ErrorCode = 0;
bIsConnected = true;
}
}
else
bIsConnected = false;
} |
quand j'arrive a GetDefaultInterface, il ne voit pas de lien ouvert et donc appelle Connect qui se comporte comme précédement décrit. à plus:ccool:
Et on revient au CoInitialize
Il y a une incohérence dans mon application. J'ai maintenant organisé mon application pour que on sorte avec un Co_Unitialize. Quand je redémarre mon application soit après le CoUninitilize soit après un reboot de la machine le co_Initialize sort un status False comme si on avait déjà ouvert un port Dcom sur le thread.
Je ne trouve rien dans la doc du CoInitilize qui explique ce phénomène. après tout, avant je forçait le CoInitialize en passant systématiquement immédiatement avant l'ouverture dans le CoUninitilize, ce qui n'est pas sain et peut expliquer les problèmes de connect ultérieurs.
Comme piste j'explore actuellement le type TWordApplication qui est un fils de TOleServer, qui confirme mon défaut de CoInitialize.
J'ai fait une recherche dans mon référentiel et je n'ai trouvé qu'un appel a CoInitialize. Celà exclue l'hypothèse d'une autre modification qui aurait introduit un autre CoInitialize
Je suis toujours en attente d'une suggestion:ccool:
Ce que j'ai fait à partir de vos conseil
Bonjour:D
D'abord merci à tous ceux qui m'ont répondu leurs réponses m'ont permis d'avancer.
D'abord une petite information sur la cause du problème
Il y a certainement un effet de bord entre le lien Ole de Word et le code d'IBPP qui gère la base de donnée. En effet en mettant l'initialise de word avant d'appeler IBPP::FactoryDatabase, le code marche et pas après le FactoryDatabase
donc d'abord le code du connect
avec l'appel des fonctions
Code:
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
|
// on initialise d'abord Word
DocType = objDocument.StrToEnum( *psDocType);
ErrorCode = m_pDocument->StartReader( DocType);
if( ErrorCode == INIT_NO_ERROR)
ErrorCode = m_pDocument->OpenDocument( *psSourceFileName);
// puis la base de donnée
wsDatabaseName = L"Interbase";
if (INIT_NO_ERROR != objMDBManager.ConnectServer( L"LocalHost",
m_sDatabasePath, wsServerLogin, wsServerPswd, wsDatabaseFileName))
{
return FAILURE;
}
if ( FAILURE == objMDBManager.OpenDatabase(m_sDatabasePath.c_str()))
{
return FAILURE;
}
// Set the class variables with the source and target languages
m_sSourceLanguage = L"English";
m_sTargetLanguage = L"English";
enSourceLanguage = objCLanguage.StrToEnum( m_sSourceLanguage);
if( FAILURE == objMDBManager.InitiateDatabase( m_sSourceFileName, L"", enSourceLanguage, &iIdDoc, &iSourceId))
{
return FAILURE;
} |
avec les includes
Word_2K.cpp et Word_2K_srvr.cpp sont dans le projet
enfin le code du connect
Code:
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
|
ErrorCode = CoInitialize(NULL);
if( ErrorCode == INIT_NO_ERROR)
{
m_pWordApplication = new WORDVER::TWordApplication(NULL);
m_pWordApplication->InitServerData();
if( m_pWordApplication != NULL)
{
m_pWordApplication->Connect( );
bIsConnected = true;
}
else
bIsConnected = false;
}
else if( ErrorCode == S_FALSE)
{ // False signifie déjà ouvert, on va faire comme si le lien était ouvert
m_pWordApplication = new TWordApplication(NULL);
m_pWordApplication->InitServerData();
if( m_pWordApplication != NULL)
{
m_pWordApplication->Connect();
ErrorCode = 0;
bIsConnected = true;
}
else
bIsConnected = false;
}
else if( ErrorCode == E_INVALIDARG)
bIsConnected = false;
else if( ErrorCode == E_UNEXPECTED)
bIsConnected = false;
} |
Ces codes fonctionnant, en route pour de nouvelles aventures, c'est:ccool: