Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2015.01.18;
Скачать: [xml.tar.bz2];

Вниз

Вызов функции из DLL. Мистика   Найти похожие ветки 

 
pasha_golub ©   (2012-02-17 14:11) [0]

Друзья, конечно же мистики быть не может, но мой мозг устал. Взываю к ноосфере.

Имеем:

PGconn *PQconnectdbParams(const char **keywords, const char **values, int expand_dbname);


Обявляем у себя:
type  TPQconnectdbParams = function(Keywords: PPAnsiChar; Values: PPAnsichar; ExpandDBName: integer): PPGconn; cdecl;

var TPQconnectdbParams: TPQconnectdbParams


Используем:

function _PQConnectDBParams(AParams: TStrings; ExpandDbName: boolean = False): PPGConn;
var
 ConnKeywords, ConnValues: packed array of PAnsiChar;
 K,V: AnsiString;
 i: integer;
begin
 SetLength(ConnKeywords, AParams.Count);
 SetLength(ConnValues, AParams.Count);
 for i := 0 to AParams.Count - 1 do
  begin
    K := UTF8Encode(AParams.Names[i]); //since this is connection assume we"ll use UTF8
    GetMem(ConnKeywords[i], Length(K) + 1);
    StrPCopy(ConnKeywords[i], K);
    V := UTF8Encode(AParams.ValueFromIndex[i]);
    GetMem(ConnValues[i], Length(V) + 1);
    StrPCopy(ConnValues[i], V);
  end;
  try
    Result := PQconnectdbParams(@ConnKeywords[0], @ConnValues[0], ord(ExpandDbName));
  finally
    for i := 0 to AParams.Count - 1 do
     begin
      FreeMem(ConnValues[i]);
      FreeMem(ConnKeywords[i]);
     end;
  end;
end;


Но беда. Иногда, при чем фиг пойми при каких условиях, первый вызов не работает. То есть возвращается nil, а повторный работает. На некоторых машинах в ответ выдается такая ошибка, что существует подозрение на неверно сконструированные параметры.

Я знаю, как это переписать и есть рабочий код. Но тысяча чертей! Что тут не так?


 
icWasya ©   (2012-02-17 14:16) [1]

Не знаю что это за DLL, но, навскидку, а как она определяет размер массива Keywords и Values? Может быть в конце надо добавить нулевой элемент?


 
jack128_   (2012-02-17 14:20) [2]

сколько символов копирует StrPCopy ?? Length(Str) или Length(Str) + 1 ??  Если первое, то у тя нет гарантии, что строки нулем заканчиваются..


 
pasha_golub ©   (2012-02-17 14:20) [3]


> Может быть в конце надо добавить нулевой элемент?

Логично, чтоб мне на Бейсике всю жизнь программировать! Щас попробую


 
pasha_golub ©   (2012-02-17 14:21) [4]


> сколько символов копирует StrPCopy

Копирует Length(str) и завершает нулем.


 
pasha_golub ©   (2012-02-17 14:32) [5]


> icWasya ©   (17.02.12 14:16) [1]

Василий, ты гений! С меня пивас! И того получилось:
function _PQConnectDBParams(AParams: TStrings; ExpandDbName: boolean = False): PPGConn;
var
 ConnKeywords, ConnValues: packed array of PAnsiChar;
 K,V: AnsiString;
 i: integer;
begin
 SetLength(ConnKeywords, AParams.Count + 1);
 SetLength(ConnValues, AParams.Count + 1);
 for i := 0 to AParams.Count - 1 do
  begin
    K := UTF8Encode(AParams.Names[i]); //since this is connection assume we"ll use UTF8
    GetMem(ConnKeywords[i], Length(K) + 1);
    StrPCopy(ConnKeywords[i], K);
    {$IFDEF DELPHI_7}
    V := UTF8Encode(AParams.ValueFromIndex[i]);
    GetMem(ConnValues[i], Length(V) + 1);
    StrPCopy(ConnValues[i], V);
  end;
  try
    ConnKeywords[High(ConnKeywords)] := nil; //icWasya is a God!
    ConnValues[High(ConnValues)] := nil; //icWasya is a God!
    Result := PQconnectdbParams(@ConnKeywords[0], @ConnValues[0], ord(ExpandDbName));
  finally
    for i := 0 to AParams.Count - 1 do
     begin
      FreeMem(ConnValues[i]);
      FreeMem(ConnKeywords[i]);
     end;
  end;
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2015.01.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
15-1401961291
Minsk City
2014-06-05 13:41
2015.01.18
Delphi and C#


15-1402175199
Андрюша
2014-06-08 01:06
2015.01.18
Как избежать Deadlock в Firebird?


9-1180944483
Jkot
2007-06-04 12:08
2015.01.18
Отклонение вектора


15-1401723069
Dennis I. Komarov
2014-06-02 19:31
2015.01.18
CDO


15-1402950602
Юрий
2014-06-17 00:30
2015.01.18
С днем рождения ! 17 июня 2014 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский