W
Vielen dank für die Antworten.
Die Variante mit dem ' BSTR' werde ich noch ausprobieren. Die erste Variante ist ganz interessant.
Ich geh davon aus, dass diese Variante nicht legitim und C++-konform ist. Wie auch, hier wird die Deletezeile doch gleich übersprungen.
//Das hier ist bestimmt nicht legitim oder??
int getLongString2(char** ppStr,int iStr)
{
CreateRandomString(_ppStr,iStr);
*ppStr=*_ppStr;
return std::strlen(*_ppStr);
delete [] *ppStr;
};
Wie sieht es den mit dem aus?
using System;
using System.Data;
using System.Text;
using System.Diagnostics;
using System.Collections;
using Microsoft.VisualBasic;
using System.Collections.Generic;
using System.Runtime.InteropServices;
public class MainClass
{
[DllImport("CreateString.dll", CharSet = CharSet.Ansi)]
public static extern int getLongString1(IntPtr ptrStr, int iStrLen);
//<DllImport("CreateString.dll", CharSet:=CharSet.Ansi)> _
//Public Shared Function getLongString2(ByVal ptrStr As IntPtr, ByVal iStrLen As Integer) As Integer
//End Function
[DllImport("CreateString.dll", CharSet = CharSet.Ansi)]
public static extern bool deleteString();
public static void Main()
{
int iStrLen = 10000000;
StringBuilder sbRandom = null;
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr.Zero));
int iStrRnd = getLongString1(ptr, iStrLen);
IntPtr ptr0 = Marshal.ReadIntPtr(ptr);
sbRandom = new StringBuilder(Marshal.PtrToStringAnsi(ptr0),iStrRnd);
Marshal.FreeHGlobal(ptr);
if (deleteString()) {
System.Diagnostics.Debugger.Break();
}
}
}
Hier wird die Variable '_ppStr' öffentlich deklariert. Sie weisst später dann der Variable 'ppStr' den Wert zu. Sobald ich in .Net bin, wird anschliessend die Funktion deleteString aufgerufen. Bei mir funktionert das, aber ich Frag mich, ob so nicht trozdem ein Speicherleck produziert wird?
#pragma once
#ifndef __CreateString_DLL_H__
#define __CreateString_DLL_H__
#include <iostream>
#include <windows.h>
#define EXP32 extern "C" __declspec(dllexport)
EXP32 int _stdcall getLongString1(char** ppStr,int iStrLen);
EXP32 bool _stdcall deleteString();
#endif
#include "stdafx.h"
#include <time.h>
#include <string>
#include "CreateString.h"
char *cS;
time_t t;
int random;
char **_ppStr;
void CreateRandomString(int &iSize)
{
const char alphanum[] ="0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
_ppStr=&cS;
time (&t);
srand((unsigned int)t);
int iiMax=std::strlen(alphanum);
char *pStr=new char[iSize];
memset(pStr,0,iSize);
if(iSize>0){
for (int i=0;i<iSize;++i){
random=(rand () % iANum);
if(random>=iANum){i-=1;continue;}
if(random<0){i-=1;continue;}
pStr[i] = alphanum[random];
if(pStr[i]==0){i-=1;}
}
*_ppStr=pStr;
}
};
bool _stdcall deleteString()
{
delete [] *_ppStr;
return true;
};
int _stdcall getLongString1(char** ppStr,int iStrLen)
{
CreateRandomString(iStr);
*ppStr=*_ppStr;
/* Mach noch irgendwas */
return std::strlen(*ppStr);
};
Edit: Ok das mit dem Timer das stört mich noch. Der wird nach jedem Durchgang aufgerufen. Einmal würde sicher reichen.
gruss wachs