Click to See Complete Forum and Search --> : Invalid Address specified to RtlFreeHeap


dallasm15
March 31st, 2008, 10:10 PM
hi Im converting some C# code to C++. This is the C# code which works fine:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

using OPC;
using OPCAE;
using OPCAE.NET;

namespace ConsoleApplication1
{
class Program
{
private static void myEventHandler(object sender, userEventArgs e)
{
int nev = e.Events.Length; // number of events in this callback

for (int i = 0; i < nev; ++i) // each event in this callback
{
Console.WriteLine("Sender = " + sender.ToString() + " " + e.Events[i].Source + " " + e.Events[i].Message + "\r\n");
}
}

static void Main(string[] args)
{
// connect to the selected OPC AE server
OpcEventServer eSrv;
EventSubscriptionMgt SubscrMgt;

eSrv = new OpcEventServer();
int rtc = eSrv.Connect("localhost", "Advosol.SimAEServer.1");
if (HRESULTS.Failed(rtc))
{
Console.WriteLine("Cannot connect to server, error 0x" + rtc.ToString("X"));
}
else
{
// create an event subsrciption and install an OnEvent callback handler
OnAEeventHandler ceh = new OnAEeventHandler(myEventHandler);
SubscrMgt = new EventSubscriptionMgt(ceh);

int BufTime, MaxSize;
rtc = SubscrMgt.Create(eSrv, true, 1000, 100, 1, out BufTime, out MaxSize);
if (HRESULTS.Failed(rtc))
{
Console.WriteLine(eSrv.GetErrorString(rtc));
}
else
{
Console.WriteLine("Connected");
}
}
Thread.Sleep(10000000);
}
}
}

This is the C++/CLI code:

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#using <System.dll>
#using "OpcAENet.Dll"

using namespace System;
using namespace OPC;
using namespace OPCAE;
using namespace OPCAE::NET;

#pragma managed

void testGetServers();
void testConnect();
void myEventHandler(Object^ SubscrMgt, userEventArgs^ e);

int _tmain(int argc, _TCHAR* argv[])
{
try {
// testGetServers();
testConnect();
printf("Press any key...\n");
_getch();
} catch (Exception^ ex) {
printf("%s\n",ex->Message);
return -1;
}
return 0;
}

void testGetServers() {
OpcAEServerBrowser^ srvList = gcnew OpcAEServerBrowser("");
array<String^>^ servers;
srvList->GetServerList(servers);
if (servers == nullptr)
{
printf("No OPC AE 1.0 Servers found\n");
}
else
{
for (int x=0;x<servers->Length;x++) {
printf("%s\n",servers[x]);
}
}
}


void testConnect() {
OpcEventServer^ eSrv;
EventSubscriptionMgt^ SubscrMgt;

const char* machineName="localhost";
const char* serverName="Advosol.SimAEServer.1";
eSrv = gcnew OpcEventServer();
String^ csMachineName=gcnew String(machineName);
String^ csServerName=gcnew String(serverName);
int rtc = eSrv->Connect(csMachineName, csServerName);
if (HRESULTS::Failed(rtc))
{
char error[1000];
sprintf_s(error,1000,"Cannot connect to server, error 0x%0x",rtc);
printf("%s\n",error);
return;
}
// create an event subscription and install an OnEvent callback handler
OnAEeventHandler^ ceh = gcnew OnAEeventHandler(myEventHandler);
SubscrMgt = gcnew EventSubscriptionMgt(ceh);

int BufTime, MaxSize;
rtc = SubscrMgt->Create(eSrv, true, 1000, 100, 1, BufTime, MaxSize);
if (HRESULTS::Failed(rtc))
{
char error[1000];
sprintf_s(error,1000,"%s",eSrv->GetErrorString(rtc));
printf("%s",error);
return;
}
printf("Success\n");
Sleep(INFINITE);
printf("Woke up\n");
}

void myEventHandler(Object^ SubscrMgt, userEventArgs^ e)
{
printf("Got Here\n");
try {
int nev = e->Events->Length; // number of events in this callback

for (int i = 0; i < nev; ++i) // each event in this callback
{
printf("%s %s\n",e->Events[i]->Source,e->Events[i]->Message);
}
} catch(Exception^ ex) {
char message[1000];
sprintf_s(message,1000,"Error: %s\n",ex->Message);
printf("%s",message);
return;
}
}


#pragma unmanaged

When I run the C++ code I dialog box saying an error has occurred,
and this is in the output:

HEAP[OpcListenerTest.exe]: Invalid Address specified to RtlFreeHeap( 00150000, 03995200 )
Windows has triggered a breakpoint in OpcListenerTest.exe.

This may be due to a corruption of the heap, and indicates a bug in OpcListenerTest.exe or any of the DLLs it has loaded.

The output window may have more diagnostic information

and this is the call stack:

> ntdll.dll!DbgBreakPoint()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x6737 bytes
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x6b74 bytes
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x7d5a bytes
ntdll.dll!RtlInitializeSListHead() + 0x115c0 bytes
ntdll.dll!iswdigit() + 0x128 bytes
ole32.dll!ComPs_NdrDllCanUnloadNow() + 0xdb bytes
ole32.dll!CoTaskMemFree() + 0x13 bytes
mscorlib.dll!System.Runtime.InteropServices.Marshal.FreeCoTaskMem(System.IntPtr ptr) + 0x93 bytes
OpcAENet.dll!OPCAE.NET.EventSubscriptionMgt.OPCAE.Interface.IOPCEventSink.OnEvent(int hClientSubscription = 1, bool bRefresh = false, bool bLastRefresh = false, int dwCount = 1, System.IntPtr pEvents = 60379904) + 0x23e bytes
[Native to Managed Transition]
rpcrt4.dll!CheckVerificationTrailer() + 0x70 bytes

so any ideas why this is happening in C++ but not in C#

dallasm15
April 2nd, 2008, 12:38 AM
Well I figured out what my problem was. The C++ code works fine if you have the compiler option:

/clr:pure

with just /clr it crashes.