C# Com Object - Недостаточно памяти

Я создал небольшую библиотеку C#, которая предоставляет объект COM, который используется для отображения средства просмотра CrystalReport.

У меня есть такой код в моем тестовом приложении C#, который работает по мере необходимости, и отображается отчет

public partial class ReportHolder : UserControl
    {
        private string _reportFilename;
        private string _datasourcePath;

        public ReportHolder(string reportFilename, string datasourcePath)
        {
            InitializeComponent();

            _reportFilename = reportFilename;
            _datasourcePath = datasourcePath;
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if (string.IsNullOrEmpty(_reportFilename))
                return;

            ReportDocument doc = new ReportDocument();
            doc.Load(_reportFilename);

            ConnectionInfo connectionInfo = new ConnectionInfo();
            string serverName = string.Format("Driver={{Driver do Microsoft dBase (*.dbf)}};DBQ={0};DefaultDir={0};DriverId=533;FIL=dBase 5.0;UserCommitSync=Yes", _datasourcePath);
            connectionInfo.ServerName = serverName;
            connectionInfo.Type = ConnectionInfoType.DBFile;

            Tables tables = doc.Database.Tables;
            foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
            {
                TableLogOnInfo logonInfo = table.LogOnInfo;
                logonInfo.ConnectionInfo = connectionInfo;
                table.ApplyLogOnInfo(logonInfo);
            }

            //doc.VerifyDatabase();
            crViewer.UseWaitCursor = true;
            crViewer.ReportSource = doc;
            crViewer.RefreshReport();
            crViewer.UseWaitCursor = false;
        }
    }

Теперь у меня есть тот же UserControl внутри моего C# Com Object

[ComVisible(true)]
[Guid("F8FB6B66-5A15-4396-8A81-D7B8655E2869")]
[ClassInterface(ClassInterfaceType.None)]
public class Se32ComBridge : ISe32ComBridge
{
    public Se32ComBridge()
    {  

  }

[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

public IntPtr ShowReport(IntPtr hWndParent, string reportFileName, string datasourcePath)
{
    ReportHolder reportHolder = new ReportHolder(reportFileName, datasourcePath);
    SetParent(reportHolder.Handle, hWndParent);
    reportHolder.LoadReport(reportFileName, datasourcePath);
    return reportHolder.Handle;
}
}

где hwndChild является фактическим HWND из окна в приложении WinAPI C++.

который я создаю из нативного приложения C++, вот так

sam32_net_bridge::ISe32ComBridgePtr pIBridge(__uuidof(sam32_net_bridge::Se32ComBridge));
_bstr_t reportFilename(_reportFilename.c_ptr());
_bstr_t datasourcePath(_datasourcePath.c_ptr());
pIBridge->ShowReport((long)hWnd, reportFilename, datasourcePath, &_controlHandle);

И вот я получаю такое исключение

System.OutOfMemoryException: было сгенерировано исключение типа "System.OutOfMemoryException". в System.Threading.Thread.StartInternal(принципал IPrincipal, StackCrawlMark& ​​stackMark) в System.Threading.Thread.Start(StackCrawlMark& ​​stackMark) в System.Threading.Thread.Start() в System.Drawing.ImageAnimator.Animate(изображение, изображение, EventHandler) onFrameChangedHandler) в System.Windows.Forms.ButtonBase.Animate(Boolean animate) в System.Windows.Forms.ButtonBase.Animate() в System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e) в System.Windows.Forms.Control.SetVisibleCore(логическое значение) в System.Windows.Forms.Control.Show() в CrystalDecisions.Windows.Forms.CrystalReportViewer.ShowProgressAnimation(Boolean включен) в CrystalDecisions.Windows.Forms.CrystalReportViewer.set_ReportSource(значение объекта) в sam.bridge.ReportHolder.OnLoad(EventArgs e) в \app\sam32.net.bridge\ReportHolder.cs: строка 52 в System.Windows.Forms.UserControl.OnCreateControl() в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl() в System.Windows.Forms.Control.WmShowWindow(Message& m) в System.Windows.Forms.Control.WndProc(Message& m) в System.Windows.Forms.ScrollableControl.WndProc(Сообщение & m) в System.Windows.Forms.UserControl.WndProc(Сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Сообщение & m) в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

мне кажется, что Threading делает что-то смешное, когда не работает в полной среде.NET. Итак, мне интересно, что еще я должен правильно установить в этом COM-объекте, чтобы он работал как нужно.

Спасибо

0 ответов

Другие вопросы по тегам