Probleme mit Ausdruck

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Arrag0n
Beiträge: 32
Registriert: 24.06.2005 20:49
Wohnort: Austria
Kontaktdaten:

Probleme mit Ausdruck

Beitrag 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
Aus den Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag 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
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Benutzeravatar
Arrag0n
Beiträge: 32
Registriert: 24.06.2005 20:49
Wohnort: Austria
Kontaktdaten:

Beitrag von Arrag0n »

:D Vielen Dank

Werds gleich morgen testen.

Grüße Arrag0n
Aus den Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.
Antworten