2016-04-06 19 views
1

Der Versuch, druckbare Daten für die OS X-Anwendung zu erhalten. Es scheint sich um das Erstellen einer Sitzung, dann um ein Seitenformat, um das Überprüfen des Formats usw. zu handeln. Der Code wird kompiliert, erhält aber den Status -50 von PMCreateSession. Richte ich printSession nicht korrekt aus? Normalerweise müssen Sie nicht so viel mit UnsafeMutablePointers beschäftigen.PMCreateSession erstellt keine Drucksitzung

Danke! unsachgemäß

let printSession: UnsafeMutablePointer<PMPrintSession> = nil 
    let pmPageFormat: UnsafeMutablePointer<PMPageFormat> = nil 
    var status = PMCreateSession(printSession) 
    status = PMCreatePageFormat(pmPageFormat) 
    status = PMSessionDefaultPageFormat(printSession.memory, pmPageFormat.memory) 
    let changed: UnsafeMutablePointer<DarwinBoolean> = nil 
    status = PMSessionValidatePageFormat(printSession.memory, pmPageFormat.memory, changed) 
    changed.destroy() 
    var pRect = PMRect() 
    status = PMGetAdjustedPageRect(pmPageFormat.memory, &pRect) 

    Swift.print("pRect \(pRect)") 

    status = PMRelease(pmPageFormat) 
    status = PMRelease(printSession) 
+0

Funktioniert besser beim Zuweisen der Zeiger. Beispiel: printSession = UnsafeMutablePointer .alloc (1) Wenn printSession, pmPageFormat und changed so deklariert und zugewiesen werden, wird tatsächlich ein sinnvolles rect (0, 0, 734, 576) erstellt. Aber stürzt immer noch auf den PMRelease-Anruf und unsicher warum. – JKaz

+0

Für jetzt ersetzt die PMRelease (printSession) (und andere PMRelease) mit printSession.destroy() und printSession.dealloc (1). Keine offensichtlichen schädlichen Auswirkungen, aber unsicher, ob das richtig ist oder warum PMRelease abstürzt. – JKaz

Antwort

0

Am erklärte ich printSession?

One eine PMPrintSession erwerben könnte wie folgt aussehen:

let printInfo = NSPrintInfo.shared() 
let printSession = PMPrintSession(printInfo.pmPrintSession()) 

Normalerweise müssen also nicht umgehen:

// create a C Null pointer of type PMPrintSession 
let printSession = unsafeBitCast(0, to: PMPrintSession.self) 
// pass by & converts PMPrintSession to UnsafeMutablePointer<PMPrintSession> 
PMCreateSession(&printSession) 
… 
// recast printSession to release memory 
PMRelease(PMObject(printSession)) 

Alternativ kann ein PMPrintSession aus dem Cocoa NSPrintInfo zugegriffen werden viel mit UnsafeMutablePointers

Informationen Weitere Informationen über eine UnsafeMutablePointer mit sehen Stackoverflow "How to use UnsafeMutablePointer in Swift?"

Ein vollständiges Beispiel von Core-Drucken mit mit Swift 004.42Apple_CorePrintingExample auf GitHub sehen.

+0

Danke für die Antwort. Ich werde diesen Code, wenn es die Zeit erlaubt (vor einem Jahr scheint es ein Leben lang!) In diesen Code zurückverwandeln und versuchen, Vorschläge zu überprüfen und zu akzeptieren, wenn ich das tue oder wenn ich andere Kommentare sehe, dass dies der richtige Ansatz ist. Nicht ignorieren oder zögern zu akzeptieren; nur an Deadlines mit anderen Sachen im Moment. Vielen Dank. – JKaz