проблема взаимодействия С++ и Managed C++
От: Grimlock  
Дата: 27.12.05 09:38
Оценка:
написал я на С++ код и с компили в длл

#include <string>

__declspec (dllexport) char * TestStringFromStdString(std::string value)
{
return (char *) value.data();
}

__declspec (dllexport) char * TestStringFromStdStringRef(std::string & value)
{
return (char *) value.data();
}

__declspec (dllexport) char * TestStringFromStdStringPtr(std::string * value)
{
return (char *) value->data();
}

и на Managed C++

using namespace System;

typedef char * (* TestStringFromStdString) (std::string);
typedef char * (* TestStringFromStdStringRef) (std::string &);
typedef char * (* TestStringFromStdStringPtr) (std::string *);

int main(array<System::String ^> ^args)
{
HMODULE module = LoadLibrary(L"ppc.dll");

char * inputValue0 = "halloWorld";

TestStringFromStdString t0 = (TestStringFromStdString) GetProcAddress(module, "TestStringFromStdString");
TestStringFromStdStringRef t1 = (TestStringFromStdStringRef) GetProcAddress(module, "TestStringFromStdStringRef");
TestStringFromStdStringPtr t2 = (TestStringFromStdStringPtr) GetProcAddress(module, "TestStringFromStdStringPtr");

char * outputValue0 = t0(std::string(inputValue0));
char * outputValue1 = t1(std::string(inputValue0));
char * outputValue2 = t2(new std::string(inputValue0));

Console::WriteLine(gcnew String(outputValue0));
Console::WriteLine(gcnew String(outputValue1));
Console::WriteLine(gcnew String(outputValue2));

FreeLibrary(module);

return 0;
}

результаты вот :

(у↕

halloWorld

так вот авопрос почему не работает передача данных .... даже по ссылке? ... а по ссылке работает (хотя по опредеению ссылка это консантный указатель((
Re: проблема взаимодействия С++ и Managed C++
От: Аноним  
Дата: 27.12.05 13:49
Оценка:
G>так вот авопрос почему не работает передача данных .... даже по ссылке? ... а по ссылке работает (хотя по опредеению ссылка это консантный указатель((

Это не "проблема взаимодействия С++ и Managed C++", а "проблема незнания основ C++": в первых двух случаях вы пытаетесь использовать данные временных обектов std::string, которые к моменту их использования уже разрушены. В третьем случае — обект не временный, зато есть утечка памяти.
Re[2]: проблема взаимодействия С++ и Managed C++
От: Grimlock  
Дата: 28.12.05 09:23
Оценка:
Здравствуйте, Аноним, Вы писали:


G>>так вот авопрос почему не работает передача данных .... даже по ссылке? ... а по ссылке работает (хотя по опредеению ссылка это консантный указатель((


А>Это не "проблема взаимодействия С++ и Managed C++", а "проблема незнания основ C++": в первых двух случаях вы пытаетесь использовать данные временных обектов std::string, которые к моменту их использования уже разрушены. В третьем случае — обект не временный, зато есть утечка памяти.


перепиал код

using namespace System;

typedef char * (* TestStringFromStdString) (std::string);

typedef char * (* TestStringFromStdStringRef) (std::string &);

typedef char * (* TestStringFromStdStringPtr) (std::string *);

int main(array<System::String ^> ^args)
{
HMODULE module = LoadLibrary(L"ppc.dll");

char * inputValue0 = "halloWorld";

TestStringFromStdString t0 = (TestStringFromStdString) GetProcAddress(module, "TestStringFromStdString");

TestStringFromStdStringRef t1 = (TestStringFromStdStringRef) GetProcAddress(module, "TestStringFromStdStringRef");

TestStringFromStdStringPtr t2 = (TestStringFromStdStringPtr) GetProcAddress(module, "TestStringFromStdStringPtr");

std::string s(inputValue0);

char * outputValue0 = t0( s );

char * outputValue1 = t1( s );

char * outputValue2 = t2( &s );

Console::WriteLine(gcnew String(outputValue0));

Console::WriteLine(gcnew String(outputValue1));

Console::WriteLine(gcnew String(outputValue2));

FreeLibrary(module);

return 0;
}

2 и 3 варианты работают .... почему не работает первый???
Re[3]: проблема взаимодействия С++ и Managed C++
От: Аноним  
Дата: 28.12.05 12:08
Оценка:
Здравствуйте, Grimlock, Вы писали:

GG>2 и 3 варианты работают .... почему не работает первый???



В функцию __declspec (dllexport) char * TestStringFromStdString(std::string value)
{
return (char *) value.data();
}

передаётся на стеке временная копия std::string, которая разрушается при возврате из функции, а вы пытаетесь использовать данные этого объекта.

Здесь
char * outputValue2 = t2(new std::string(inputValue0));
имеет место утечка памяти.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.