Seite 1 von 1

Probleme mit Ausdruck

Verfasst: 13.04.2006 11:21
von Arrag0n
Hallo

Hab mir eine Routiene erstellt die einen Bereich des Bildschirms captured, um 90 Grad dreht, mit einer Beschreibung versieht und Ausdruckt.
Das Funktioniert soweit perfekt. Jedoch wenn ich nach dem Ausdruck versuche eine DB Connection (PBOSL) herzustellen, bekomme ich immer "Invalid Memory Access".
Was mache ich falsch?? :(
Code ist leider noch PB3.94 wie auch die PBOSL.

Code: Alles auswählen

Procedure PrintGraph()  ;Desktop Ausschnitt "Capturen" und drucken mit WinApi 
  If hwnd_Graph
    hBmp.l       = CreateImage(0, 2000, 2000)
    hdcWnd.l     = GetDC_(hwnd_Graph)
    hDektop.l    = GetDesktopWindow_()
    hdcDesktop.l = GetDC_(hdcDesktop)
    hdcBmp       = CreateCompatibleDC_(hdcWnd)
    
    SelectObject_(hdcBmp,hBmp)
    ;Standardrucker-Namen ermitteln
    PrinterHandle.l = 0
    STDPrinterName$ = Space(260)
    GetPrivateProfileString_("WINDOWS","DEVICE","", @STDPrinterName$, 260, "Win.Ini")
    STDPrinterName$ = StringField(STDPrinterName$, 1,",")
    
    OpenPrinter_(STDPrinterName$,@PrinterHandle.l,0)
    
    Dim DevIn.DEVMODE(0)
    Dim DevOut.DEVMODE(0)
    DocumentProperties_(0,PrinterHandle,STDPrinterName$,DevIn(0),DevOut(0),#DM_OUT_BUFFER|#DM_IN_BUFFER)
    DevIn(0)\dmOrientation = 2 ;auf Querdruck setzen
    
    PrinterDC.l = CreateDC_("WINSPOOL",STDPrinterName$,0,DevIn(0))
    
    DocInf.DOCINFO
    DocInf\cbSize = SizeOf(DOCINFO)
    DocInf\lpszDocName = @"TWE-DL"
    DocInf\lpszOutput = #Null
    
    PrinterWidth = GetDeviceCaps_(PrinterDC, #HORZRES)
    PrinterHeight = GetDeviceCaps_(PrinterDC, #VERTRES)
    
    If StartDoc_(PrinterDC,@DocInf) > 0
      If StartPage_(PrinterDC) > 0
        SetTextAlign_(PrinterDC,#TA_CENTER)
        SetBkMode_(PrinterDC, #TRANSPARENT)
        SetTextColor_(PrinterDC, RGB(0, 0, 90))
        TextOut_(PrinterDC,PrinterWidth/2,170,"TWE - DL ",52)
        
        SetTextAlign_(PrinterDC,#TA_LEFT)
        SetTextColor_(PrinterDC, RGB(0,0,0))
        txtOutD.s = "Bereich : " + GetGadgetText(#cmb_Era) + "      Beginn : " + GetGadgetText(#cmb_Day)+"."+GetGadgetText(#cmb_Month)+"."+Str(ActiveYear)+" - "+GetGadgetText(#cmb_Hour)+":00"
        TextOut_(PrinterDC,200,250,txtOutD,Len(txtOutD))
        
        SetTextColor_(PrinterDC, RGB(255,50,39)) ; Beschreibung Feed A
        txtFeedA.s = GetGadgetText(#cmb_FeedA)
        TextOut_(PrinterDC,200,310,txtFeedA,Len(txtFeedA))
        
        SetTextColor_(PrinterDC, RGB(107,255,56)) ; Beschreibung Feed B
        txtFeedB.s = GetGadgetText(#cmb_FeedB)
        TextOut_(PrinterDC,1400,310,txtFeedB,Len(txtFeedB))
        
        SetTextColor_(PrinterDC, RGB(70,0,230)) ; Beschreibung Feed C
        txtFeedC.s = GetGadgetText(#cmb_FeedC)
        TextOut_(PrinterDC,2600,310,txtFeedC,Len(txtFeedC))
        
        imgDC = ImageID()
        hdc = CreateCompatibleDC_(PrinterDC)
        SelectObject_(hdc, imgDC)
        ;StretchBlt_(PrinterDC,200,380,PrinterWidth -380 ,PrinterHeight -430 ,hdcDesktop,15,204,995,548,#SRCCOPY)
        StretchBlt_(PrinterDC,200,380, 380 , 430 ,hdcDesktop,15,204,995,548,#SRCCOPY)
        EndPage_(PrinterDC)
        EndDoc_(PrinterDC)
        DeleteDC_(hdc)
        DeleteDC_(PrinterDC)
      EndIf
      
    EndIf
    ClosePrinter_(PrinterHandle)
  EndIf
  DeleteDC_(hdcBmp)
  FreeImage(0)
EndProcedure
Arrag0n

Verfasst: 13.04.2006 16:06
von ABBKlaus
tja also ich würd ja sagen der API aufruf DocumentProperties ist falsch und überschreibt teile des speichers. Das wird wohl der Grund für das verspätete ableben deines Programms sein :?

kleiner Ausschnitt aus meiner Printer_Lib :

Code: Alles auswählen

ProcedureDLL.l Print_OpenPrinter(PrinterName$,Option$)
  If PrintLib_PN=""
    PrintLib_PN=Print_GetDefaultPrinter()
  Else
    PrintLib_PN=PrinterName$
  EndIf
  
  res=OpenPrinter_(PrintLib_PN,@PrintLib_PH,0)
  If res
    Buffersize.l=DocumentProperties_(0,PrintLib_PH,PrintLib_PN,0,0,0)
    If Buffersize=<0
      ProcedureReturn 0
    EndIf
    *DevBufferIn=AllocateMemory(Buffersize)
    *DevBufferOut=AllocateMemory(Buffersize)
    DocumentProperties_(0,PrintLib_PH,PrintLib_PN,*DevBufferIn,*DevBufferOut,#DM_OUT_BUFFER|#DM_IN_BUFFER)
    *PrinterParameters.DEVMODE=*DevBufferIn
    
    Fields=Print_ConvertOptions(Option$,*PrinterParameters.DEVMODE)
    
    If GetVersion_()&$FF0000 ; Windows NT/XP
      lpszDriver.s = "WINSPOOL"
    Else ; Win 9x/Me
      lpszDriver = ""
    EndIf
    PrintLib_DC=CreateDC_(@lpszDriver,PrintLib_PN,0,*PrinterParameters)
    FreeMemory(*DevBufferIn)
    FreeMemory(*DevBufferOut)
    
    Print_SetBkMode(#TRANSPARENT)
    
    Print_CreatePen(PrintLib_Linestyle,PrintLib_Linewidth,PrintLib_Linecolor,0,0)
    
    ProcedureReturn PrintLib_DC
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Verfasst: 13.04.2006 20:37
von Arrag0n
:D Vielen Dank

Werds gleich morgen testen.

Grüße Arrag0n