Gå til innhold

Anbefalte innlegg

Folkens...

Jeg har en WinForm som inneholder en WebBrowser component. Dette funker helt glitrende helt til jeg kaller opp denne formen fra et Win32 progream. Jeg har en Template som gjør om en static class til et standard Win32 format slik at jeg kan kalle metodene rett fra et annet Win32 program på lik linke som en hvilken som helst annen API

 

Problemet er at WebBrowser componentet ikek liker at jeg gjør det på denne måten og får:

Inner Exception:

Kan ikke opprette ActiveX-kontrollen 8856f961-340a-11d0-a96b-00c04fd705a2 fordi den gjeldende tråden ikke er i en enkelttrådet apartment.

 

Jeg har googlet dette og det må visst startes i en såkallt STA thread. Dette gjøres jo normal i _MAIN i et program, men her har jeg jo ikek noe program. Win32 programmet er jo selve programmet..

 

Noe tip som hvordan jeg kan løse dette før jeg starter med å lage min egen WEBBrowser control ?

 

Takker for all hjelp...

Lenke til kommentar
Videoannonse
Annonse

Tenkte nok det så jeg prøvde følgende:

[DllExport("Communisafe_AddCase", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.BStr)]
[sTAThread]
static string Communisafe_AddCase([MarshalAs(UnmanagedType.BStr)] string pUserID, [MarshalAs(UnmanagedType.BStr)] string pPassword, [MarshalAs(UnmanagedType.BStr)] string pCaseId)
   {
    var u = Advisor.Model.Managers.SecurityManager.Instance.GetUser(pUserID, pPassword);
    if (u == null)
	    return "No access. Invalid username or password.";
    return Advisor.Communisafe.GUI.CommunisafeInterOP.AddCase(u, pCaseId); // Det er denne som etter hvert resulterer i feil
   }

Skulle tro dette kallet, med underliggende kall videre inn, dermed gikk på en STAThread, men det feiler fortsatt altså.

Endret av HDSoftware
Lenke til kommentar

Tenkte nok det så jeg prøvde følgende:

[DllExport("Communisafe_AddCase", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.BStr)]
[sTAThread]
static string Communisafe_AddCase([MarshalAs(UnmanagedType.BStr)] string pUserID, [MarshalAs(UnmanagedType.BStr)] string pPassword, [MarshalAs(UnmanagedType.BStr)] string pCaseId)
{
	var u = Advisor.Model.Managers.SecurityManager.Instance.GetUser(pUserID, pPassword);
	if (u == null)
		return "No access. Invalid username or password.";
	return Advisor.Communisafe.GUI.CommunisafeInterOP.AddCase(u, pCaseId); // Det er denne som etter hvert resulterer i feil
}

Skulle tro dette kallet, med underliggende kall videre inn, dermed gikk på en STAThread, men det feiler fortsatt altså.

Det kan umulig være entry pointet til en tråd.

Lenke til kommentar

Tror dette blir tull og tøys...

 

Er det ikek slik at en ny tråd har sitt eget data scope? Hvis jeg fyrer av en ny tråd i dette kallet, hva skjer da med tillgangen til alle de andre objektene jeg har instansert?

Forenklet prototype av .NET DLL'en

[DllExport("InitiateAgent")......
static void InitiateAgent()
{
 // Setter opp alt som er nødvendig og henter en masse data fra moder applikasjonen som er en Win32 APP
}

[DllExport("Api1").....
static void API1()
{
 // Utfører ett eller annet
}

[DllExport("API2").....
static void API2()
{
  wEditor.ShowNewEditor();
}

Sett at det nå er wShowNewEditor som resulterer i feilen og at jeg løser det ved å legge den på en egen tråd. Vil da wEditor få tilgang til det som allerede er instansert? Er ikek denne prosesse thread-safe og dermed underlagt beskyttelse av omverdnen?

 

En anne ting som er veldig rart er at jeg i samme vinduet har lagt på en kontrol som jeg selv har laget. Denne kontrollen har også en WebBrowser. Noen grunn til at denne ikke skal feile ?

 

Kansje har en CONTROL egen håndtering av dette? Kansje kan jeg wrappe WebBrowser inn i min egen Control og heller bruke denne....

Lenke til kommentar

Hehe. Det er det egentlig ikke heller. Du må hacke MSIL resultatet som genereres av VS i etterkant.

Du kan selvsagt automatisere dette ved å bruke denne templaten: https://sites.google.com/site/robertgiesecke/Home/uploads/csharpprojecttemplateforunmanagedexports

 

Funker som en drøm.... Og åpner en drøss med muligheter. Fatter ikke at Microsoft ikke bare la til [DllExport] først som sist. Merkelig at vi må ty til 3rd party greier for noe så sentralt..

Lenke til kommentar
  • 2 måneder senere...

Liten kommentar til bruk av nevnte template for å eksportere metoder i en .NET DLL: I Visual Studio 2012 så har av en eller annen merkelig grunn Microsoft latt være å legge path til ILDASM.EXE. Dette resulterer i en feilmelding ved kompillering som sier noe så informativt som "File not found". Og det sier jeg dere - dette er det eneste som kommer frem ;-) Ingen henvisninger til noe annet som helst. Hacket meg litt rundt og fant ut at templatet prøver å kjøre ILDASM for å dra ut MSIL. Åpnet en DOS boks og skrev ILDASM og vips så skjønte jeg hva som var problemet. Enkel løsning er derfor: Søk opp ILDASM.EXE på maskinen. Du får noen alternativer, noen 32bit og noen 64bit. Legg til path til en av dem i system innstillingene på maskinen din, restart VS2012 og vips vaps vups.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...