Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2012, 01:22   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

..................
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.02.2012, 01:23   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

......................
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.02.2012, 01:24   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почему вы берете адрес указателя, а не его значение(у вас же уже указатель)?
Цитата:
Теперь другая проблема..
FreeMem посылает меня лесом..
а так же смотрим пост №7, пояснение в скобках.
Цитата:
cdecl не самый удобный для соглашения вызова c++ и delphi?
без разницы, главное чтоб одинакого было указано в обьявлении функции и в реализации.
Цитата:
p.s. для использования дельфийской dll в с++, по прежнему нужны танцы с бубном(*.def), при сборке dll в delphi?
LoadLibrary никто не отменял.
а для создания lib не обязательно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.02.2012, 01:36   #14
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
а так же смотрим пост №7, пояснение в скобках.
В dll не использую sharemem. Да и при передаче PChar, он вроде не нужен.
Но до конца не понял этого:
Цитата:
тут то кто вызовет эту функцию должен будет вызвать FreeMem(причем именно от вашего менагера)
Я должен написать в dll метод:
Код:
procedure myFree(aP:Pointer); cdecl;
begin
  FreeMem(aP);
end;
??

Цитата:
почему вы берете адрес указателя, а не его значение(у вас же уже указатель)?
Опять не понял. FreeMem требует указатель на кусок памяти.

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  s: string;
  p:PChar;
begin
  p:=GetHLPath;
  s:=WideCharToString(p);
  FreeMem(@p);
в S, у меня успешно поподает строка с информацией. программа вылетает на освобождении переменной.

А если я подключу FastMM, это что-нибудь изменит?
Человек_Борща вне форума Ответить с цитированием
Старый 19.02.2012, 07:42   #15
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

А почему-бы просто не использовать WideString?

Код:
function InitDLL(aPEFile: WideString): NativeInt; cdecl;
function GetHLPath: WideString; cdecl;
Если же прототипы фиксированные, то приём строки - это просто:
Код:
function InitDLL(aPEFile: PChar): NativeInt; cdecl;
var
 str:string;
begin
  str := aPEFile;
  if FileExists(str) then
  begin
    sHLPath := ExtractFilePath(str);
    Result := fRESULT_OK;
  end
  else
  begin
    Result := fRESULT_ERROR;
  end;
end;
Возврат строки - существенно сложнее.

Вот несколько примеров - см. раздел "Ручное выполнение правила".
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.02.2012, 09:41   #16
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

GunSmoker,
Я их и использовал изначально. Потом подумал, что с ними нужно использовать и какой-нибудь менеджер памяти. А его надо таскать с собой.

Поэтому решил через PChar.

Но PChar оказались граблями, по этому я перешел на WideString и подключил FastMM.
Человек_Борща вне форума Ответить с цитированием
Старый 19.02.2012, 09:44   #17
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Для WideString не нужен никакой специальный менеджер памяти. Не имеет значения, что использует программа или DLL - штатный, FastMM, SafeMM, ShareMem - без разницы.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.02.2012, 11:05   #18
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

GunSmoker,
в XE2 тип string приводится к WideString автоматически, или надо явно использовать WideString?
Человек_Борща вне форума Ответить с цитированием
Старый 19.02.2012, 11:09   #19
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В любой Delphi работа с WideString аналогична работе с String. Одно к другому приводится простым присваиванием.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.02.2012, 11:20   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
FreeMem требует указатель на кусок памяти.
PChar это уже указатель.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Embarcadero Delphi XE2 Partner DVD (Зборник компонентов для XE2) volod3000 Софт 2 01.11.2011 02:26
Передача переменной в EXE Evgen1503 Общие вопросы Delphi 6 03.05.2010 15:56
Передача строк из dll sprofxx Общие вопросы Delphi 9 02.04.2010 07:41
Передача строки exe (с формой (API)) ↔ exe (форма скрыта) Alex Cones Общие вопросы Delphi 16 04.10.2009 15:26
Запуск Load.dll (бывшая Load.exe) в дереве проц-ов, Как запустить прогой на C# .dll-ку kapustin Общие вопросы .NET 10 23.09.2009 22:20