Главная страница
    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-1402829721
Юрий Зотов
2014-06-15 14:55
2015.01.18
Диск накрылся - чем лечить?


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


2-1387265285
aka
2013-12-17 11:28
2015.01.18
Что быстрее будет работать?


15-1402502056
Сергей
2014-06-11 19:54
2015.01.18
состав числа


11-1257251317
Игорь Шевченко
2009-11-03 15:28
2015.01.18
Прошу прощения, по ошибке закрыл ветку "Использование MakeMethod"





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский