Avatar billede kahs79 Nybegynder
03. oktober 2011 - 15:10 Der er 15 kommentarer og
1 løsning

Print til printer via ActiveX control

Hej
Jeg har udviklet en ActiveX kontrol, for at give brugere af et website muligheden for, at printe direkte til en Zebra label printer.

Jeg giver brugere muligheden for at printe til printeren via IP og port eller ved at indtaste en sti til en delt printer.

Via IP har vi ingen problemer.

Problemet opstår når vi forsøger at printe til en delt printer, men kun hvis klientens styresystem er Windows 7 (Vi har ikke testet på en Vista maskine). Der er ingen problemer med at fange printeren fra en XP maskine.

Koden ser således ud:

Byte[] data = System.Text.Encoding.GetEncoding(1252).GetBytes(Text);
SafeFileHandle printer = CreateFile(Path, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
if (printer.IsInvalid == true)
{
    return "Could not connect to printer. Printer path:" + Path;
}

FileStream lpt1 = new FileStream(printer, FileAccess.ReadWrite);
lpt1.Write(data, 0, data.Length);

lpt1.Close();
return "OK";

Jeg håber at I kan hjælpe.
/Kristina
Avatar billede kgkg Nybegynder
03. oktober 2011 - 16:55 #1
Jeg kunne da forstille mig at det er noget AV software og/eller Firewall der går ind og blokere. Og når det er en ActiveX kontrol, så har Internet Explorer sikker også en finger på pulsen.

Hvad sker der hvis Firewall og AV software slås fra, kan der så udskrives.

Logges der nogen events i eventloggen, når printeren tilgås?
Avatar billede kahs79 Nybegynder
04. oktober 2011 - 17:34 #2
Hej
Firewall er slået fra og der er ingenting i eventviewer.
Antivirus er ikke slået fra, men der er ikke noget at i dens log.

Kan det ikke være noget med rettigheder til at skrive til printer?
CreateFile(..

/Kristina
Avatar billede kgkg Nybegynder
05. oktober 2011 - 21:31 #3
Hvad sker der hvis programmet som bruger din ActiveX komponent startes med Admin rettigheder.

Har du prøvet at slå UAC fra på win 7 PC'en. Bare for at se om det er den der laver et eller andet.

Hvordan er din share oprettet?

Se evt. artiklen her:

http://answers.microsoft.com/en-us/windows/forum/windows_7-hardware/printing-from-windows-7-machine-through-a-print/523a479d-c197-40b3-a633-078d80d79eb1

Der er et lille udklip fra artiklen her:


I had a similar problem with Windows 7 on HP Pavilion Slimline trying to print to a shared printer (HP4250) connected via parallel port to a Windows XP machine.

I saw some posts about Vista having similar problems (see "Windows vista printing to shared windows xp machine") and copied their technique.
I added the printer as a local printer (not networked), then selected Create a New Port, and for Type Of Port, a selected Local Port from the drop down list.
Click next, then enter the network name (ie \\xpmachinename\printername ). This didn't work at first, but then I changed the printer sharing on the XP machine from Shared to Don't Share, and then back to Shared. Then the Windows 7 machine was able to recognise \\xpmachinename\printername and the rest of the configuration was straighforward - I was able to find the correct driver without having to download a driver from HP's website.
Avatar billede kahs79 Nybegynder
06. oktober 2011 - 13:14 #4
Hej igen
Ja, jeg har forsøgt med at staret IE som administrator, men det løser det ikke.
Jeg har ikke forsøgt med at slå UAC fra, men det vil jeg da prøve.

Det er en maskine som står i Mexico, så jeg får først adgang til den senere i dag. Du skal nok høre fra mig om det løser det.

/Kristina
Avatar billede kahs79 Nybegynder
06. oktober 2011 - 19:05 #5
UAC er slået fra, men stadig ingen forskel.

Min share er operret som følgende:
Højreklikket på printer og valgt Printer Properties. Fanen Delt og hak i Del denne printer.
Herefter er indtastet et printer share navn.

Jeg forsøger at fange printeren på printerstien \\computernavn\printersharenavn
Avatar billede kgkg Nybegynder
06. oktober 2011 - 20:21 #6
Kan du pinge printerstien \\computernavn og \\computernavn\printersharenavn ?

Hvis ikke, så er det problemet.

Kan du tilgå printerstien hvis du erstatter \\computernavn med \\IP adresse?

Er NETBIOS over TCP/IP enabled?

Prøv lige at se denne artikel:

http://www.howtogeek.com/howto/windows-7/share-files-and-printers-between-windows-7-and-xp/

og denne:

http://www.sevenforums.com/hardware-devices/21951-windows-7-access-shared-printer-xp.html
Avatar billede kahs79 Nybegynder
07. oktober 2011 - 09:36 #7
Nej jeg kan ikke pinge stien.
Jeg kan pinge computeren og jeg kan fange den delte printer fra en anden PC (XP maskine). Så delingen må være fin nok.

Jeg kan heller ikke fange printeren via ActiveX kontrollen, hvis jeg skrifter computernavn ud med IP adressen.
Printeren er koblet til den PC som jeg prøver at fange den på.

/Kristina
Avatar billede kgkg Nybegynder
07. oktober 2011 - 17:04 #8
Kan du se printeren på din Windows 7 PC under Netværk og Internet | Vis computere og enheder på netværket (Network and internet | View network computers and devices)?

Prøv lige at gøre de ting som står i denne guide og kom med resultatet her.

http://helpdeskgeek.com/windows-7/xp-to-windows-7-printer-sharing/
Avatar billede kahs79 Nybegynder
08. november 2011 - 13:58 #9
Jeg har fuld Share a Printer from XP to Windows 7 guiden og har ingen problemer med at dele printeren og se den fra andre maskiner.
Jeg kan end uden problemer printe fra en XP maskine til den delte printer på Windows 7 maskinen, så det er ikke delingen som er problemet.

Jeg tror problemet er at min ActiveX ikke kan se printer driver eller får lov til at forbinde til printeren via driveren..

/Kristina
Avatar billede kahs79 Nybegynder
08. november 2011 - 14:27 #10
Marshal.GetHRForLastWin32Error() returnerer: -2147024894
og
Marshal.GetLastWin32Error()returnerer: 2

Hvis jeg kalder en printer som ikke findes får jeg følgende fejl:
Marshal.GetHRForLastWin32Error() returnerer: -2147024829
og
Marshal.GetLastWin32Error()returnerer: 67

..Hvis det skulle kunne hjælp..

/Kristina
Avatar billede kgkg Nybegynder
08. november 2011 - 17:02 #11
Fejl 2 betyder The system cannot find the file specified.

Fejl 67 betyder The network name cannot be found. og den er jo forståelig nok.

I din linje:
SafeFileHandle printer = CreateFile(Path, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

Hvad indeholder Path
Avatar billede kahs79 Nybegynder
08. november 2011 - 19:59 #12
Den indeholder printer stien \\computernavn\delteprinternavn
Avatar billede kgkg Nybegynder
08. november 2011 - 22:01 #13
Din ShareMode parameter (nr. 3) i CreateFile er 0.

Og det betyder: Prevents other processes from opening a file or device if they request delete, read, or write access

Hvad sker der hvis du ændre den til 2 (FILE_SHARE_WRITE)

Jeg er ved at løbe tør for ideer.
Avatar billede kahs79 Nybegynder
09. november 2011 - 09:32 #14
Ingen forskel, desværre.
Avatar billede kahs79 Nybegynder
09. november 2011 - 09:51 #15
Hmm..
Fandt lige denne her:
http://www.tech-archive.net/Archive/VC/microsoft.public.vc.mfc/2008-04/msg00820.html

Og hvis jeg ændre CreationDisposition fra OPEN_EXISTING til OPEN_ALWAYS så virker det.

Testet både i Windows XP og Windows 7

Koden kom til at se således ud:
SafeFileHandle printer = CreateFile(Path, GENERIC_WRITE, 2, IntPtr.Zero, OPEN_ALWAYS, 0, IntPtr.Zero);

Har ikke testet om ShareMode kan være 0, endnu.
Du får points for at have led mig i den rigtige retning :)
Smider du et svar?

/Kristina
Avatar billede kgkg Nybegynder
09. november 2011 - 19:46 #16
Hermed et svar.

Glad for at høre at du fik det til at virke...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester