Question appel compliqué des interfaces de WAB32
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Un pointeur n'est qu'une adresse.\" error CS0117: 'System.IntPtr' ne contient pas de définition pour 'Import'\"[/code:1]
noel écrit:
Avec OLEView on voit que le ClsID de IAddrBook( Mapi.dll/Mapi32.dll) est {00020309-0000-0000-C000-000000000046}.Il faudrait que je puisse déclarer que lppWABObject est une interface avec tous ses membres.
Du coup on trouve des exemples de déclaration de cette interface COM .
D'autre liens référencent CDO/MAPI.
C'est peut être une piste...
On peut aussi tomber sur ce genre de code
Comme le sujet m'intéresse je regarderais ça dès que je peux, mais pour l'instant je peux peu
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
Ben pour moi né le 25/12, c'est toujours \"joyeux noël\".
J'arrive à faire mon import en C/C++. Au delà du besoin ponctuel, je comprends que je ne pourrais jamais tout comprendre dans les objets com, avec ou sans mélange de langage.
Je me permets une précision. L'api qui m'a mis KO est dans \"C:\Program Files\Fichiers communs\System\wab32.dll\" donc dans outlookExpress et non dans MAPI32.DLL de OutLook de Office. Les doc de msdn sont peut être différentes.
Et comme j'ai aussi besoin de créer le mot de passe de la BAL de OE6, je \"joue\" aussi avec PStore qui est encore une vieille \"techno/api\" que l'on retrouve par hasard dans MSDN (dans des developpers Notes je crois).
Tout ca pour dire qu'il me semble qu'il y ait 2 objets distincts, l'un connu des ClassRoot\Clsid et un \"vieil inconnu\" de OE. Là aussi, ce sera C/C++ car il y a aussi une fonction à appeler pour obtenir l'interface.
Je n'ose pas reformuler ma question, à savoir, puisque la fonction retourne une adresse sur l'interface, donc sur la Vtable, et que les fonctions sont dans l'ordre de la déclaration de l'interface dans le .h(uniquement en 32 bits), ne peut on pas \"caster\" ... mais les paramètres...?
Je devrais être content puisque ca marche en C/C++.
Joyeux, Noël. (une virgule qui a du poids)
Bonne soirée.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Oui tu as raison, je me fais avoir à chaque foisJe me permets une précision. L'api qui m'a mis KO est dans [code:1]\"C:\Program Files\Fichiers communs\System\wab32.dll\"[/code:1] donc dans outlookExpress et non dans MAPI32.DLL de OutLook de Office.
De mon coté, je n'utilise plus OE6 depuis 2003.
noel écrit:
C'est fort probable, car, jusqu'à il y a peu, OE6 faisait partie des appli MS non documentées, par exemple le format .pst.Tout ca pour dire qu'il me semble qu'il y ait 2 objets distincts, l'un connu des ClassRoot\Clsid et un \"vieil inconnu\" de OE.
noel écrit:
Si tu peux, mais dans des forums spécialisés C/C++/Windows.Je n'ose pas reformuler ma question
noel écrit:
Rien ne vaut de bonnes veilles API Win32 avec un langage statiqueJe devrais être content puisque ca marche en C/C++.
Parfois j'aimerais bien, sous PS, avoir les avantages d'un langage statique et ceux du dynamisme...
Et si tu peux poster ton code ici ou ailleurs, il sera utile à d'autres je pense.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
Avec les réserves d'usage, ce qui suit permet d'importer un carnet d'adresse OE. Ce code n'est pas loin d'un torchon car je ne suis pas un codeur, juste un copieur/colleur. C'était ma base de travail pour tenter de faire mieux en C# (appel de import, passage du nom sur la ligne de commande, test de l'existence du fichier). Pour faire encore plus exotique, j'ai voulu utiliser devc++ comme compilateur. Et il a fallu que j'aille récupérer les divers fichiers WAB.H et autres WAB....h sur un vieux VC5 que je n'arrive plus à utiliser. Bref, bricole et bidouille.
De fil en aiguille, j'ai fait une version qui crée une entrée dans le WAB (juste le nom et l'adresse, mais c'est \"ouvert\", faut juste coder la suite),la supprime si elle existe, mais c'est un autre programme, plus gros et encore plus paquet de nouilles. Là aussi, le passage en C# était le but de la manip.
Ces bouts de code m'aide pour les installations automatiques de micro XP avec OE chez des commerçants, 4000 à 8000 à terme. Ca peut apparaître bricolage mais mon chef dit que seul le résultat compte et que si le client est content, je dois l'être aussi.
[code:1]
// non unicode !!!
#include <windows.h>
#include <iostream>
//#include \"stdafx.h\"
#include <wab.h>
//int APIENTRY _tWinMain(HINSTANCE hInstance,
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
LPWABOPEN lpfnWABOpen = NULL; // Defined in Wabapi.h.
HINSTANCE hinstWAB = NULL;
LPWABOBJECT lppWABObject;
LPADRBOOK lppAdrBook;
HRESULT hr = E_FAIL;
LPWABIMPORTPARAM lpWABParam;
TCHAR szWABDllPath[MAX_PATH];
DWORD dwType = 0;
ULONG cbData = sizeof(szWABDllPath);
HKEY hKey = NULL;
*szWABDllPath = '\0';
// First we look under the default WAB DLL path location in the
// Registry.
// WAB_DLL_PATH_KEY is defined in wabapi.h
//
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, WAB_DLL_PATH_KEY, 0, KEY_READ, &hKey))
// RegQueryValueEx( hKey, L\"\", NULL, &dwType, (LPBYTE) szWABDllPath, &cbData);
RegQueryValueEx( hKey, \"\", NULL, &dwType, (LPBYTE) szWABDllPath, &cbData);
if(hKey) RegCloseKey(hKey);
// if the Registry came up blank, we do a loadlibrary on the wab32.dll
// WAB_DLL_NAME is defined in wabapi.h
//
hinstWAB = LoadLibrary( (lstrlen(szWABDllPath)) ? szWABDllPath : WAB_DLL_NAME );
if (hinstWAB«»)
{
lpfnWABOpen = (LPWABOPEN) GetProcAddress(hinstWAB, \"WABOpen\"«»);
if (lpfnWABOpen)
{
WAB_PARAM wp = {0};
wp.cbSize = sizeof(WAB_PARAM);
// Only want to deal with \"Main Identity's Contacts\"
wp.ulFlags = WAB_ENABLE_PROFILES;
// hr = lpfnWABOpen (&lppAdrBook, &lppWABObject,NULL, 0);
hr = lpfnWABOpen (&lppAdrBook, &lppWABObject, &wp, 0);
if (hr != S_OK)
{
// MessageBox(NULL,L\"Outlook Express WAB Book Update Failed!\",L\"Update\",MB_OK);
MessageBox(NULL,\"GetProcAddress Failed!\",\"Update\",MB_OK);
exit(1);
}
lpWABParam=(LPWABIMPORTPARAM)(malloc(sizeof (WABIMPORTPARAM)));
lpWABParam->cbSize=sizeof (WABIMPORTPARAM);
// ouverture d'une openfile_box pour sélectionner le fichier
lpWABParam->ulFlags = MAPI_DIALOG;
lpWABParam->lpszFileName = NULL;
// avec le fichier désigné
lpWABParam->lpszFileName = \"c:\\tmp\\toto.wab\";
lpWABParam->lpAdrBook=lppAdrBook;
HRESULT res=lppWABObject->Import( (LPTSTR) lpWABParam);
if(res!=S_OK){
char buf[255];
sprintf(buf,\"lppWABObject->Import %x\",res);
MessageBox(NULL, buf,\"Update Failed !\",MB_OK);
//MessageBox(NULL,\"Import Failed !\",\"Update\",MB_OK);
exit(1);
}
}//fin if wabopen
}//fin loadlibrary ok
MessageBox(NULL,\"Outlook Express Wab Book Updated!\",\"Update\",MB_OK);
FreeLibrary(hinstWAB«»);
return 1;
}
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
J'ai retrouvé ce tutorial sur COM dans un coin perdu de mon micro. Je le poste au cas où...
Je ne sais pas s'il peut servir.
Comme il y a un auteur il y a sûrement des précautions à prendre...
Cordialement
Message édité par: noel, à: 28/12/10 23:56
3 eme essai pour joindre un fichier. c'est un 7Z que j'ai renommé en pdf pour aller plus vite. Bidouille, quand tu me tiens....<br><br>Message édité par: noel, à: 28/12/10 23:59
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
La pièce jointe tutorial_com.pdf est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- appel compliqué des interfaces de WAB32