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 (основной принцип IP,
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 (Объект
значение) в sam32.net.bridge.ReportHolder.OnLoad (EventArgs e) в
\ Приложение \ 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& м) в
System.Windows.Forms.Control.WndProc (Message& м) в
System.Windows.Forms.ScrollableControl.WndProc (Message& м) в
System.Windows.Forms.UserControl.WndProc (Message& м) в
System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message& м)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Сообщение&
m) в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32
msg, IntPtr wparam, IntPtr lparam)

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

Спасибо

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]