C# вызов функции из Dll валится с эксепшеном
От: RinatY  
Дата: 05.12.06 12:56
Оценка:
на сях есть следующая фукция:

__declspec(dllexport) char* __cdecl GetBidList(char* secname, char* boardname)
{
    char* Bids = new char[1000];
    Bids[0] = '\0';
    return Bids;
}


ее мы пытаемся грузить из C#

    [DllImport("Matching.dll", EntryPoint = "GetBidList")]
    public static extern string GetBidList( string secname, string secboard );


потом пробуем ее вызывать 6 раз подрят

BidsDATA = MatchingTool.GetBidList( this.Params.SecName, (string)Boards[i] );
BidsDATA = MatchingTool.GetBidList( this.Params.SecName, (string)Boards[i] );
BidsDATA = MatchingTool.GetBidList( this.Params.SecName, (string)Boards[i] );
BidsDATA = MatchingTool.GetBidList( this.Params.SecName, (string)Boards[i] );
BidsDATA = MatchingTool.GetBidList( this.Params.SecName, (string)Boards[i] );
BidsDATA = MatchingTool.GetBidList( this.Params.SecName, (string)Boards[i] );


Если запускать на windows 2000, то первые 5 он нормально работает, а на 6-й падает с экспешеном про NullReference.

А если запускать на машинке с windows xp, то все работает.

Опытным путем установил, что если дллку заменить на следующую:
__declspec(dllexport) char* __cdecl GetBidList(char* secname, char* boardname)
{
    char* Bids = new char[1000];
    Bids[0] = '\0';
    return NULL;
}

то все работает

и если сделать следующую дллку
char Test[1000];
__declspec(dllexport) char* __cdecl GetBidList(char* secname, char* boardname)
{
    char* Bids = new char[1000];
    Test[0] = '\0';
    return Test;
}

то тоже все работает
Re: C# вызов функции из Dll валится с эксепшеном
От: DPX-Infinity Россия  
Дата: 05.12.06 16:05
Оценка:
Здравствуйте, RinatY, Вы писали:

RY>
RY>    [DllImport("Matching.dll", EntryPoint = "GetBidList")]
RY>    public static extern string GetBidList( string secname, string secboard );
RY>


К сожалению проверить ошибку не могу т.к. нет Win2000.
В C# коде надо явно указать, что соглашение о передче параметров — cdecl, т.к.
"The default value for the CallingConvention field is WinAPI, which in turn defaults to StdCall convention." (MSDN). Т.е.
RY>
RY>    [DllImport("Matching.dll", EntryPoint = "GetBidList", CallingConvention=CallingConvention.Cdecl)]
RY>    public static extern string GetBidList( string secname, string secboard );
RY>

Попробуйте, может поможет.
Re: C# вызов функции из Dll валится с эксепшеном
От: Аноним  
Дата: 05.12.06 23:42
Оценка:
Похоже объяснение здесь
Автор: AlexZu
Дата: 24.10.06
Re[2]: C# вызов функции из Dll валится с эксепшеном
От: RinatY  
Дата: 06.12.06 09:01
Оценка:
Здравствуйте, DPX-Infinity, Вы писали:

DI>Здравствуйте, RinatY, Вы писали:


DI>К сожалению проверить ошибку не могу т.к. нет Win2000.

DI>В C# коде надо явно указать, что соглашение о передче параметров — cdecl, т.к.
DI>"The default value for the CallingConvention field is WinAPI, which in turn defaults to StdCall convention." (MSDN). Т.е.
RY>>
RY>>    [DllImport("Matching.dll", EntryPoint = "GetBidList", CallingConvention=CallingConvention.Cdecl)]
RY>>    public static extern string GetBidList( string secname, string secboard );
RY>>

DI>Попробуйте, может поможет.

В начале так и было написано. Ошибка все-равно была..
C# вызов функции из Dll валится с эксепшеном
От: Аноним  
Дата: 06.12.06 10:10
Оценка:
Если есть возможость фукцию на на сях немного переписать, то возращайте результат параметром void GetBidList(char* secname, char* boardname, char* result), при вызове передавая StringBuilder нужного размера.
-----
Нулевое оформления постов благодаря Opere.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: C# вызов функции из Dll валится с эксепшеном
От: AlexZu Россия  
Дата: 06.12.06 21:12
Оценка:
Здравствуйте, RinatY, Вы писали:

DI>>В C# коде надо явно указать, что соглашение о передче параметров — cdecl, т.к.

DI>>"The default value for the CallingConvention field is WinAPI, which in turn defaults to StdCall convention." (MSDN). Т.е.
RY>>>
RY>>>    [DllImport("Matching.dll", EntryPoint = "GetBidList", CallingConvention=CallingConvention.Cdecl)]
RY>>>    public static extern string GetBidList( string secname, string secboard );
RY>>>

DI>>Попробуйте, может поможет.

RY>В начале так и было написано. Ошибка все-равно была..

Обязательно укажите необходимый CallingConvention ,а по поводу возвращаемой строки посмотрите здесь
Автор: AlexZu
Дата: 05.12.06
.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.