на сях есть следующая фукция:
__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;
}
то тоже все работает
Здравствуйте, 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>
Попробуйте, может поможет.
Здравствуйте, 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>Попробуйте, может поможет.
В начале так и было написано. Ошибка все-равно была..
Если есть возможость фукцию на на сях немного переписать, то возращайте результат параметром void GetBidList(char* secname, char* boardname, char* result), при вызове передавая StringBuilder нужного размера.
-----
Нулевое оформления постов благодаря Opere.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, 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
.