Tjena ok, har hittat lite kod nu som man kanske kan använda men detta är helt klart utanför mina domäner: Är det ingen som har nån koll på sånt här? Jag tycker att det borde gå?!?Hämta alla körandes objekt (COM)
Skulle behöva komma åt flera instanser av samma objekt.
Säg att användaren har startat MinApp.exe och kör i den.
Nu kan jag ju hämta objektet genom att köra typ System.Runtime.InteropServices.Marshal.GetActiveObject("MinApp.Application");
Problemet är ju bara när användaren har flera instanser utav MinApp igång samtidigt eftersom man inte vet vilken instans man får tag på. Jag vet inte heller vilken fil som användaren har öppnat.
Hur ska man lösa detta?
Kan man på nåt sätt loopa igenom processerna och få skapa instanser av programmet utifrån en process på nåt sätt?
Eller kan man på nåt sätt få tag på alla objekt i Running Object Table och på så sätt få tag på alla objekt?
********* EDIT **********
Tanken är att jag via mitt program skall kunna plocka ett värde från en instans av MinApp och skicka den till en annan instans av MinApp. MinApp är en tredjeparts produkt, typ Excel.Sv: Hämta alla körandes objekt (COM)
<code>
[ DllImport ( "Ole32.Dll" ) ]
public static extern int CreateBindCtx ( int reserved, out UCOMIBindCtx bindCtx );
private ArrayList Test()
{
ArrayList fireobj=new ArrayList();
string spatfire="!{ABEB76D0-2859-11D2-B125-006008C52C3F}";
UCOMIBindCtx bc;
Ole32.CreateBindCtx ( 0, out bc );
UCOMIRunningObjectTable rot;
bc.GetRunningObjectTable ( out rot );
UCOMIEnumMoniker enumMkr;
rot.EnumRunning ( out enumMkr );
UCOMIMoniker[] elts = new UCOMIMoniker[1];
int cnt;
int ret;
Guid guid=Guid.NewGuid("00000000-0000-0000-C000-000000000046");
while ( ( ret = enumMkr.Next ( 1, elts, out cnt ) ) >= 0 && ( cnt > 0 ) )
{
string displayName;
Object obj=null;
elts[0].GetDisplayName ( bc, null, out displayName );
if(displayName==spatfire)
{
elts[0].BindToObject(bc,null,ref guid,out obj); //HÄR BLIR DET FEL
if(obj!=null)fireobj.Add(obj);
}
}
return fireobj;
}
</code>
Jag vet inte ens om det kommer fungera men jag tycker att BindToObject verkar vara rätt angrepps sätt. Nu är bara min fråga, vad fasiken är det för guid som skall in? Mitt eget eller vad, jag får bara "The parameter is incorrect". Jag har försökt med både ett nytt Guid och GetClassID men det känns som om jag kör nattorientering en mulen novembernatt utan karta, kompass och lampa...
*****EDIT*************
GUID ska tydligen vara IID_IUnknown ({00000000-0000-0000-C000-000000000046})
Jag kommer att sticka på semester några veckor men kommer ta tag i detta när jag kommer tillbaka. Det bara måste gå!!!!!!!!!Sv: Hämta alla körandes objekt (COM)
********** EDIT ***************
Jag tror minsann att jag löste det
istället för:
<code>
if(displayName==spatfire)
{
elts[0].BindToObject(bc,null,ref guid,out obj); //HÄR BLIR DET FEL
if(obj!=null)fireobj.Add(obj);
}
</code>
körde jag:
<code>
if(displayName==spatfire)
{
rot.GetObject(elts[0],out obj);
if(obj!=null)fireobj.Add(obj);
}
</code>
Hmm, det verkar som om jag hela tiden får tillbaka samma instans.. damn... tillbaks till ruta 1