powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Delphi функция
23 сообщений из 23, страница 1 из 1
Delphi функция
    #38638562
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
        [DllImport("*.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "#100")]
        public static extern string GetFldStr(int Num, [MarshalAs(UnmanagedType.LPStr)] string Field);



Сама функция описана в файле во вложении


Вызов функции приводит к ошибке:
FatalExecutionEngineError:
The runtime has encountered a fatal error. The address of the error was at 0x6f4293ba, on thread 0x22f0. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

Что не так и куда копать подскажите плз?
...
Рейтинг: 0 / 0
Delphi функция
    #38638564
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pavluha,
...
Рейтинг: 0 / 0
Delphi функция
    #38638683
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
PavluhaЧто не так и куда копать подскажите плз?
Я бы копал в написание этой функции на C#
...
Рейтинг: 0 / 0
Delphi функция
    #38638690
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,

О какой функции вы говорите, если это функция из библиотеки Delphi
Я только вызываю ее и все. Выше описан код, как я ее импортировал себе в проект
...
Рейтинг: 0 / 0
Delphi функция
    #38638749
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
PavluhaCat2,

О какой функции вы говорите, если это функция из библиотеки Delphi
Я только вызываю ее и все. Выше описан код, как я ее импортировал себе в проект
О той, которую надо написать вместо функции из библиотеки Дельфи
...
Рейтинг: 0 / 0
Delphi функция
    #38638763
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
На C# это даже не функция будет, а оператор.

string StrField = table.Rows[Num][Field].ToString();
...
Рейтинг: 0 / 0
Delphi функция
    #38638775
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,

В этом нет необходимости, т.к. при вызове ее возникает ошибка.
Вызов осуществляется вот так:
Код: c#
1.
innNum = FM.GetFldStr(9, "");
...
Рейтинг: 0 / 0
Delphi функция
    #38638795
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,

Забыл сказать, что библиотека используется в проекте скомпилированного под 4 framework.
Под 2 framework работает все хорошо, такой ошибки нет.
...
Рейтинг: 0 / 0
Delphi функция
    #38638880
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha
Код: c#
1.
*.dll


Pavluha
Код: c#
1.
EntryPoint = "#100"


Это так и должно быть?

Функция в библиотеке Delphi также имеет объявление stdcall?
...
Рейтинг: 0 / 0
Delphi функция
    #38638900
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

*.dll это я не указывал просто имя. Имя явное указано
насчет #100. это точка входа. Она корректная. Потому что в коде вызов этой функции происходит многократно и приложение "падает" не при первом вызове этой функции.
...
Рейтинг: 0 / 0
Delphi функция
    #38638903
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл упомянуть еще вот что.
Падает при использовании библиотеки в приложении скомпилированном под 4 framework, а сама библиотека, в которой используется вызов этой функции под 2 framework. Пробовал свою библиотеку скомпилировать под 4 framework. Такая же ошибка.

Еще есть вот что. Ошибка может то возникать, то нет. Я понятия не имею как с этим бороться.
...
Рейтинг: 0 / 0
Delphi функция
    #38639117
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эм... я ломокомпакт, но...

http://connect.microsoft.com/VisualStudio/feedback/details/488941/p-invoke-memory-faults-when-marshaling-byref-ansibstr-on-x64
?
Код: c#
1.
2.
        [DllImport("azimuth.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "#100")]
        public static extern IntPtr GetFldStr(int Num, IntPtr Field);



Код: c#
1.
2.
3.
4.
5.
         IntPtr pfield = Marshal.StringToHGlobalAnsi("Val");
         IntPtr pstr = GetFldStr(9, pfield);
         string val = Marshal.PtrToStringAnsi(pstr);
         Marshal.FreeHGlobal(pfield);
         //Marshal.FreeHGlobal(pstr); // ???
...
Рейтинг: 0 / 0
Delphi функция
    #38639121
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha
Код: c#
1.
innNum = FM.GetFldStr(9, "");

Фигасе, вместо адреса переменной в вызов подставляется литерал и Вы хотите чтобы это взлетело?
PChar - это УКАЗАТЕЛЬ.
Т.е. это адрес в памяти, по которому будут размещены Ваши данные.
Если в функцию передаётся в качестве параметра PChar, то литералы передавать в неё НЕЛЬЗЯ.

Объявите переменную типа string и её передавайте в вызов функции.
И ещё, что-то мне подсказывает, что параметр Field в описании функции должен быть объявлен как out.
...
Рейтинг: 0 / 0
Delphi функция
    #38639551
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser,


На этой строчке
Код: c#
1.
Marshal.FreeHGlobal(pfield);

возникает ошибка: This may be due to a corruption of the heap.........
...
Рейтинг: 0 / 0
Delphi функция
    #38639579
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я привел функции к такому типу:

Код: c#
1.
2.
[DllImport("azimuth.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "#100")]
public static extern IntPtr GetFldStr(int Num, IntPtr Field);



Этот метод теперь работает, но не работает др:
Код: c#
1.
2.
        [DllImport("azimuth.dll", EntryPoint = "#82")]
        public static extern int GetStatusNum(int byte1);// 1-6



Здесь нет ссылочных типов и ничего такого передавать не надо, но при попытке сделать так:
Код: c#
1.
FM.GetStatusNum(1)


Возникает ошибка:
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.

Получается одно правишь другое калечишь. Как только вернул все назад, все заработало.
Так в чем может быть проблема? Просто качели какие-то
...
Рейтинг: 0 / 0
Delphi функция
    #38639613
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha, Вы сейчас "переводите" с Delphi на C# ?
Может будет проще сделать COM обертку над этим унылым API с нормальным интерфейсом? Да и примеров на паскале поди поболе будет?
GetStatusNum - какая сигнатура у метода?
Как в примере показана работа с этим методом?
...
Рейтинг: 0 / 0
Delphi функция
    #38639636
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser,

В этом то и дело, что все что у меня есть, это эта длл, которую я могу использовать.
Ни исходников, ничего.

Сам метод в мануале описан так:
...
Рейтинг: 0 / 0
Delphi функция
    #38639691
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4.3.5 -?
...
Рейтинг: 0 / 0
Delphi функция
    #38639700
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser,

Это сделано предварительно. Еще беда в том, что если кинуть команду в Watcher, то данные отображаются.
Я вообще просто о....ю
...
Рейтинг: 0 / 0
Delphi функция
    #38639712
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как такое может быть, если перед вызовам метода кинуть команду в Watcher, то после этого код работает корректно?
Как такое вообще может быть?
...
Рейтинг: 0 / 0
Delphi функция
    #38639721
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот исходный код функции:
Код: pascal
1.
2.
3.
4.
5.
Function GetStatusNum(Num : Integer) : Integer;export; stdcall;
begin
 if Num in [1..6] then GetStatusNum:=StatusBuf[Num]
  else GetStatusNum:=0;
end;
...
Рейтинг: 0 / 0
Delphi функция
    #38639748
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaКак такое может быть, если перед вызовам метода кинуть команду в Watcher, то после этого код работает корректно?
Как такое вообще может быть?
Поведение в отладчике может отличаться...
И всеж... как на счет 4.3.5?
Сделайте в Delphi COM обертку с нормальным интерфейсом на этот API... и используйте его...
...
Рейтинг: 0 / 0
Delphi функция
    #38639754
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser,

В прошлом посте написал, что перед вызовом команды, сначала вызывается команда GetStatus, которая возвращает код ошибки 0. Это хорошо.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Delphi функция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]