vIRisium писал(а):Когда я пытаюсь вызвать API функцию появляется вот такое добро
[...]
Вызов функции PInvoke "Microsoft.ReportViewer.Common!Microsoft.ReportingServices.Rendering.ImageRenderer.CompositionPDF+WindowsGDIWrapper::GetGlyphIndicesW" разбалансировал стек. Вероятно, это вызвано тем, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke совпадают с неуправляемой целевой подписью.
Да я вообще ничего нигде не объявляюNord777 писал(а):Все тоже самое, только на русском.
Неправильно обьвляешь функцию
Implements IDisposable
............
Private m_currentPageIndex As Integer
Private m_streams As IList(Of Stream)
..................................
Private Sub Run()
Dim report As LocalReport = New LocalReport()
report.ReportPath = "..\..\Report.rdlc"
report.DataSources.Add(New ReportDataSource("Sales", LoadSalesData()))
ExportPDF(report)
m_currentPageIndex = 0
Print()
End Sub
..............
Private Sub Print()
'Const printerName As String = "Laser"
'Const printerName As String = "Microsoft Office Document Image Writer"
If m_streams Is Nothing Or m_streams.Count = 0 Then
Return
End If
Dim printDoc As New PrintDocument()
AddHandler printDoc.PrintPage, AddressOf PrintPage
printDoc.Print()
End Sub
....................
Private Sub PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
Dim pageImage As New Metafile(m_streams(m_currentPageIndex))
ev.Graphics.DrawImage(pageImage, ev.PageBounds)
m_currentPageIndex += 1
ev.HasMorePages = (m_currentPageIndex < m_streams.Count)
End Sub
.......................
Private Sub ExportPDF(ByVal report As LocalReport)
Dim deviceInfo As String = "<DeviceInfo>" + _
" <OutputFormat>PDF</OutputFormat>" + _
" <DpiX>300</DpiX>" + _
" <DpiY>300</DpiY>" + _
" <PageWidth>21cm</PageWidth>" + _
" <PageHeight>29.7cm</PageHeight>" + _
" <MarginTop>2cm</MarginTop>" + _
" <MarginLeft>2cm</MarginLeft>" + _
" <MarginRight>2cm</MarginRight>" + _
" <MarginBottom>2cm</MarginBottom>" + _
"</DeviceInfo>"
Dim warnings() As Warning = Nothing
m_streams = New List(Of Stream)()
report.Render("PDF", deviceInfo, AddressOf CreateStream, warnings)
Dim stream As Stream
For Each stream In m_streams
stream.Position = 0
Next
End Sub
..............................
Private Function CreateStream(ByVal name As String, _
ByVal fileNameExtension As String, _
ByVal encoding As Encoding, _
ByVal mimeType As String, _
ByVal willSeek As Boolean) As Stream
Dim stream As Stream = New FileStream("..\.." + name + "." + fileNameExtension, FileMode.Create)
m_streams.Add(stream)
Return stream
End Function
report.Render("PDF", deviceInfo, AddressOf CreateStream, warnings)
I tried sample in beta2, it didn't compile because function doesn't match delegate. Only added last parameter as below..
private Stream CreateStream( string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek, Microsoft.ReportingServices.Interfaces.StreamOper oper )
It's working fine.
Итс нот воркинг. Хотя и оттуда.Nord777 писал(а):И это тоже оттуда:I tried sample in beta2, it didn't compile because function doesn't match delegate. Only added last parameter as below..
private Stream CreateStream( string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek, Microsoft.ReportingServices.Interfaces.StreamOper oper )
It's working fine.
Дело, разумеется, совсем не в объявлении функции оказалось: https://connect.microsoft.com/feedback/viewfeedback.aspx?FeedbackID=165298Nord777 писал(а):Все тоже самое, только на русском. Неправильно обьвляешь функцию
Feedback
Reporting services: PInvokeStackImbalance when exporting report to PDF with chinese chars
Кириллица.Nord777 писал(а):Ну так там сказано что проблема возникает с китайскими символами. При чем тут твой код?
Решил.Nord777 писал(а):Ты решил проблему?
Да что ты говоришь? Какие правильные слова! А мне почему-то показалось, что на этом форуме принято только мордой в поиск по MSDN тыкатьNord777 писал(а):Было бы правильным, если бы ты написал способ решения своей проблемы. Другие участники форума тоже могут нарваться на эти же грабли.
We are aware of this issue. I have not been able to identify any errors in the generated PDF caused by this mismatch when using retail bits. Given the only manifestation of this issue is the exception that only appears in debug mode we chose not to fix it until we can do a thorough review of the code in this area. We plan for this review to be part of our next major release.
Imports System
Imports System.IO
Imports System.Data
Imports System.Text
Imports System.Drawing.Imaging
Imports System.Drawing.Printing
Imports System.Collections.Generic
Imports Microsoft.VisualBasic
Imports Microsoft.Reporting.WinForms
Public Class Check
Implements IDisposable
Private m_currentPageIndex As Integer
Private m_streams As IList(Of Stream)
''' <summary>Чтение данных из файла *.xml</summary>
Private Function LoadSalesData() As DataTable
Dim dataSet As New DataSet()
dataSet.ReadXml("..\..\data.xml")
Return dataSet.Tables(0)
End Function
Private Function CreateStream(ByVal name As String, ByVal fileNameExtension As String, _
ByVal encoding As Encoding, ByVal mimeType As String, ByVal willSeek As Boolean) As Stream
'Dim streamF As MemoryStream = New MemoryStream()
Dim streamF As Stream = New FileStream("..\.." + name + "." + fileNameExtension, FileMode.Create)
m_streams.Add(streamF) ' Добавление потока в массив
Return streamF
End Function
''' <summary>Формирование потока графики</summary>
''' <remarks>Графический Формат файла</remarks>
Private Sub ExportImage(ByVal report As LocalReport, ByVal _str As String)
Dim deviceInfo As String = "<DeviceInfo>" + _
" <OutputFormat>" + _str + "</OutputFormat>" + _
" <DpiX>300</DpiX>" + _
" <DpiY>300</DpiY>" + _
" <Compress>100</Compress>" + _
" <PageWidth>21cm</PageWidth>" + _
" <PageHeight>29.7cm</PageHeight>" + _
" <MarginTop>2cm</MarginTop>" + _
" <MarginLeft>2cm</MarginLeft>" + _
" <MarginRight>2cm</MarginRight>" + _
" <MarginBottom>2cm</MarginBottom>" + _
" </DeviceInfo>"
Dim warnings() As Warning = Nothing
m_streams = New List(Of Stream)()
report.Render("Image", deviceInfo, AddressOf CreateStream, warnings)
Dim stream As Stream
For Each stream In m_streams
stream.Position = 0
Next
End Sub
''' <summary>Формирование потока PDF</summary>
''' <remarks>Формат файла PDF vers.1.3</remarks>
'Private Sub ExportPDF(ByVal report As LocalReport)
' Dim deviceInfo As String = "<DeviceInfo>" + _
' " <OutputFormat>PDF</OutputFormat>" + _
' " <DpiX>300</DpiX>" + _
' " <DpiY>300</DpiY>" + _
' " <PageWidth>21cm</PageWidth>" + _
' " <PageHeight>29.7cm</PageHeight>" + _
' " <MarginTop>2cm</MarginTop>" + _
' " <MarginLeft>2cm</MarginLeft>" + _
' " <MarginRight>2cm</MarginRight>" + _
' " <MarginBottom>2cm</MarginBottom>" + _
' "</DeviceInfo>"
' Dim warnings() As Warning = Nothing
' m_streams = New List(Of Stream)()
' report.Render("PDF", deviceInfo, AddressOf CreateStream, warnings)
' Dim stream As Stream
' For Each stream In m_streams
' stream.Position = 0
' Next
'End Sub
''' <summary>Процедура вызывается по событию "Печать страницы"</summary>
Private Sub PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
Dim pageImage As Drawing.Image = Nothing
Try
pageImage = New Metafile(m_streams(m_currentPageIndex))
Catch ex As Exception
pageImage = New Drawing.Bitmap(m_streams(m_currentPageIndex))
End Try
ev.Graphics.DrawImage(pageImage, ev.PageBounds)
m_currentPageIndex += 1
ev.HasMorePages = (m_currentPageIndex < m_streams.Count)
End Sub
''' <summary>Процедура печати</summary>
Private Sub Print()
Const printerName As String = "Microsoft Office Document Image Writer"
If m_streams Is Nothing Or m_streams.Count = 0 Then
Return
End If
Dim printDoc As New PrintDocument()
printDoc.PrinterSettings.PrinterName = printerName
If Not printDoc.PrinterSettings.IsValid Then
Dim msg As String = String.Format("Can't find printer ""{0}"".", printerName)
MsgBox(msg)
Return
End If
AddHandler printDoc.PrintPage, AddressOf Me.PrintPage
printDoc.Print()
End Sub
''' <summary>Процедура запуска приложения</summary>
Sub Run()
Dim report As LocalReport = New LocalReport()
report.ReportPath = "..\..\Report.rdlc"
report.DataSources.Add(New ReportDataSource("Sales", LoadSalesData()))
ExportImage(report, "TIFF")
'ExportPDF(report)
m_currentPageIndex = 0
Print()
End Sub
''' <summary>Процедура уничтожения объектов по окончанию работы программы</summary>
Public Overloads Sub Dispose() Implements IDisposable.Dispose
If Not (m_streams Is Nothing) Then
Dim stream As Stream
For Each stream In m_streams
stream.Close()
Next
m_streams = Nothing
End If
End Sub
''' <summary>Стартовая процедура</summary>
Public Shared Sub Main(ByVal args As String())
Using CheckDemo As Check = New Check()
CheckDemo.Run()
End Using
End Sub
End Class
Да что ты говоришь? Какие правильные слова! А мне почему-то показалось, что на этом форуме принято только мордой в поиск по MSDN тыкать
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54