Gå til innhold

Anbefalte innlegg

Skrevet

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...

Videoannonse
Annonse
Skrevet (endret)

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
Skrevet

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.

Skrevet

Sikkert ikke, jeg bare gjorde et forsøk jeg. Greia er jo at jeg ikek starter noen tråd i det hele tatt. Det er jo Win32 programmets tråd som kaller inn i denne DLL'en

 

Mener du kansje at jeg bør starte en ny tråd i selve API'et ?

 

Hmm. Det må jeg prøve...

Skrevet

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....

Skrevet

Vel. Som sagt så finnes det ingen "Program.Main()" jeg kan hekte meg på da dette er en ren DLL

 

Løste det ved å bruke DevExpress RichTexEditor. Den kan både lagre og importere HTML. Problem løst ;-)

Skrevet

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..

  • 2 måneder senere...
Skrevet

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.

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å
×
×
  • Opprett ny...