» »

[.NET ali c#] ne najdem dokumentacije

[.NET ali c#] ne najdem dokumentacije

atasmrk ::

Tole zadevo ze en cajt iscem po netu, pa nc ne najdem:

Console.WriteLine("Owner : {0}", printJobInstance["Owner"]);
Console.WriteLine("JobID : {0}", printJobInstance["JobID"]);
Console.WriteLine("Printer : {0}", printJobInstance["Printer"]);

Torej, tisto kar me zanima je printJobInstance["nekaj"]. Kaj lahko pride namesto nekaj? Tisti Printer je narobe in takrat dobim:

at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.PropertyData.RefreshPropertyInfo()
at System.Management.PropertyDataCollection.get_Item(String propertyName)
at System.Management.ManagementBaseObject.GetPropertyValue(String propertyName)
at System.Management.ManagementBaseObject.get_Item(String propertyName)

Niti v MSDN-ju nisem najdu, kaj pod propertyValue lohk napises.
  • spremenilo: atasmrk ()

atasmrk ::

OK, najdu sm. Vse kar lahko vtaknes tm med oklepaje imas na Msdn-ju, samo nekoliko skrito nekje bogu za hrbtom.

Zdej me pa nekej druzga zanima.

Uporablam printSpoolerjeve funkcije in tiste osnovne (OpenPrinter, SetPrinter) mi je ratal prenest u c#. Problem mam z GetJob, ki naj bi ti zafilala eno strukturo z informacijami o trenutnem stanju nekega posla. ko hocem to nardit, zadeva enostavno crkne. Nobenega porocila o napaki (s tem da izjeme mecem naprej), nobenega v stilu index over array range ali karkoli takega. Nada. Zero.

Bi mrbit kksn od vs vedu, kaj mi je storiti? Sej ce nobeden ne ve, boh pomagaj.

Aja zgledoval sem se po tmle primeru: Klik

Zgodovina sprememb…

  • spremenilo: atasmrk ()

atasmrk ::

No dobr. se mal naprej sm prsu in ugotovu, kva je narobe (klic funkcije getLastWin32Error()). Izpisalo je 1784, to pa pravi; The supplied user buffer is not valid for the requested operation.

No in da vam pokazem: Funkcija, ki jo importam u svojo c# kodo:
[DllImport("WinSpool.drv",EntryPoint="GetJob", SetLastError=true)]
static extern unsafe bool GetJob(int hPrinter, int JobId, int Level, byte *pJob, int cdBuf, int *pcbNeeded);

in potem klicem to v svoji kodi:

static public unsafe void getPrintJobInfo(int hPrinter, int jobID)
{
bool uspelo = false;
byte bNull;
byte[] temp;
int bufferSize;
int bytesWritten;

uspelo = GetJob(hPrinter, jobID, 1, &bNull, 0, &bufferSize);
temp = new byte[bufferSize];
if (GetJob(hPrinter, jobID, 1, (byte*)temp[0], bufferSize, &bytesWritten) == false)
{
throw new ApplicationException("Nekaj je narobe z branjem JOB_INFO strukture" + Marshal.GetLastWin32Error());
}
System.Console.WriteLine("askdljfasdkfj");
}


Prvi klic funkcije je zato, da se doloci velikost, ki je za buffer potrebna. No in potem mu v drugem klicu tega bufferja ne uspe nafilat. Kdo ve zakaj? Kakrsenkoli predlog?

Vesoljc ::

hmm...
deklaracija funkcije pravi, da moraš podati naslov bufferja (byte* pBuf). če in ko deklarairaš buffer kot byte* pBuffer, potem bi moralo tole delovati:
byte* pBuffer = new byte[100];
GetJob(hPrinter, jobID, 1, pBuffer, bufferSize, &bytesWritten);

ampak C#-a še povohal nisem, govorim bolj na pamet...
Abnormal behavior of abnormal brain makes me normal...

atasmrk ::

Ne, javi, da ne more pretvorit byte* v byte[]. Tko da to odpade.

Sej mislm, da je edini problem, k ne vem, a morm ze jest ta plac rezervirat, a to mrbit nardi GetJob. Tko da bi mu jest podal samo en naslov in pustil funkciji, da naredi svoje, ne dela. Rezervirat toliko in toliko bajtov za pac nekaj pa se tukaj nekako ne da. Ali pa se morda motim. Videl sem ze, da je folk malloc importal v c#. Joj, kako se mi kolca po tem dobrem starem c++.

Sej bi lahko pisal tudi v njem, pa je toliko lazje pisat win aplikacije v c#.

Sicer pa, se kaksen predlog?

BigWhale ::

> na Msdn-ju, samo nekoliko skrito nekje bogu za
> hrbtom.

v MSDNju je VSE kar isces bogu za hrbtom :P ;>

preberi si 'man page' (help) za GetJob() saj je lepo napisano. pJob je out parameter funkcije, torej, to ti funkcija vrne.

Ma, malo pobrskaj po msdnju no... Glede na to kak je vhodni Level, ti potem nazaj dobis pointer na JOB_INFO_1 oziroma JOB_INFO_2 strukturo.

http://msdn.microsoft.com/library/defau...
http://msdn.microsoft.com/library/defau...

Takole nekako:

...

int level = 1;
JOB_INFO_1 my_job_info;

GetJob(... level, &my_job_info,....);

In ko se funkcija izvrsi, bodo v my_job_info strukturi podatki o print jobu...


Disclaimer: Tega nisem se nikoli pocel, tako da bi realnost znala biti malo drugacna... :)

atasmrk ::

BIgWhale, hvala, ampak jest sm to ze vsaj desetkrat prebral. Kaj je pri meni glavni problem? ko vidim, da je spremenljivka ,kamor naj bi sle informacje LPBYTE, mi je takoj jasno, da bo to ena zadeva spremenljive dolzine. In si predstavljam kot en array bytov, kjer je noter kar pac je. Potem pa jest to sparsam. In s tem nafilam tisti moj JOB_INFO. Ker kako pa naj sicer sistem ve, koliko so vsi tisti stringi noter v JOB_INFO veliki? Samo nekaj v stilu JOB_INFO_X = LPSTR jasno ne bo slo. Ali pa se motim?

BigWhale ::

Se enkrat, samo zate..

JOB_INFO je struktura, ki je ze naprej definirana... hm, takole (priblizno takole, ker sem tole snel nekje iz neta, tako da ne vem ce to drzi 100%)

typedef struct _JOB_INFO_1 {
DWORD JobId;
LPTSTR pPrinterName;
LPTSTR pMachineName;
LPTSTR pUserName;
LPTSTR pDocument;
LPTSTR pDatatype;
LPTSTR pStatus;
DWORD Status;
DWORD Priority;
DWORD Position;
DWORD TotalPages;
DWORD PagesPrinted;
SYSTEMTIME Submitted;
} JOB_INFO_1;

ko ti definiras svojo spremeljivko z:

JOB_INFO_1 my_job_info;

Ta spremnljivka ima potem obliko tiste strukture... ko ji dodelis vrednos z

GetJob(...., &my_job_info, ...);

potem to deh vrednosti dostopas nekako takole: (spet precej priblizno)

printf("Total Pages: %l", my_job_info.TotalPages);

...

Razumel? Bo slo? :)

Mogoce ne bi skodilo, ce bi si prebral kaksno knjigo o programiranju v Cju. Lahko tudi C#, saj vseeno. Samo naj bo za zacetnike, kjer ti razlozijo kako je podatek zapisan v ramu, kaj so strukture, za kaj se jih uporablja, kaj so razredi in kaj so polja.

atasmrk ::

No, tole kalvarijo smo koncali. Hvala bogu za google ( Vir). Tukaj sem dobil idejo. In speljal.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C in funkcije ter #define

Oddelek: Programiranje
463942 (2303) misek
»

[c] Enaki datoteki

Oddelek: Programiranje
71035 (895) Spura
»

[c++] prenos po referenci

Oddelek: Programiranje
92510 (2445) atasmrk
»

C#; WebClient class; problem z uploadanjem

Oddelek: Programiranje
51424 (1383) 64202
»

Nalaganje nastavitev iz tekstovne datoteke [vodič]

Oddelek: Programiranje
81020 (863) Vesoljc

Več podobnih tem