C # LoadLibrary ERROR_NO_TOKEN

Я загружаю MFC dll с зависимостями (скажем, я загружаю D.dll, который зависит от C.dll, B.dll и A.dll) на C #. Вот мой код:

[DllImport( "kernel32.dll", CharSet = CharSet.Auto, SetLastError = true )]
static extern IntPtr LoadLibrary( string lpFileName );

private void btn_Click( object sender, EventArgs e )
{
int             nUltErr;
string          strDLL;
StringBuilder   strPDF;
StringBuilder   strXML;

strDLL = "C:\\DEVELOP\\Libs\\Interfaccia\\Interfaccia_C_2005\\DLL\\Interfaccia_C_2005.dll";
strFile1 = new StringBuilder( @"C:\DEVELOP\Libs\Interfaccia\TestCase\PROGRAM\tiger.pdf" );
strFile2 = new StringBuilder( @"C:\DEVELOP\Libs\Interfaccia\TestCase\PROGRAM\tiger.XML" );
if( LoadLibrary( strDLL ) != IntPtr.Zero )
{
    LoadPDF( strPDF );
    SaveXML( strXML );
    ClosePDF();
    FreeMemory();
}
else
{
    nUltErr = Marshal.GetLastWin32Error();
    MessageBox.Show( "Errore nel caricamento della dll." );
}

}

nUltErr равно 1008 = 0x3F0, это должно быть ERROR_NO_TOKEN. Что именно это означает в C #? Путь к DLL правильный.


person IssamTP    schedule 15.05.2013    source источник
comment
DllImportAttribute.SetLastError по умолчанию false. Ваше определение импорта не меняет поведения по умолчанию. Установите SetLastError = true явно, чтобы получить код ошибки, вызванной LoadLibrary.   -  person Dennis    schedule 15.05.2013


Ответы (2)


Код ERROR_NO_TOKEN обычно означает, что кто-то пытался вызвать OpenThreadToken в потоке, который не выдавал себя за другое лицо. Это может быть проблемой или нет - это только последний код ошибки, записываемый SetlastError.

Этот вызов может быть в DllMain из Interfaccia_C_2005.dll или в DllMain любой библиотеки, на которую в свою очередь ссылаются. Не совсем понятно, зачем им это нужно, но это возможно.

Кроме того, это может не быть фактическая ошибка, вызвавшая сбой. Среди других причин LoadLibrary завершится ошибкой, если DllMain из Interfaccia_C_2005.dll или в DllMain любой библиотеки, на которую в свою очередь ссылаются, вернет false. Если DllMain возвращает false, без вызова SetLastError, GetLastError покажет предыдущую ошибку, какой бы она ни была. Например, система может быть вполне счастлива, если OpenThreadToken выйдет из строя, но что-то еще пошло не так, что не вызвало SetLastError.

По сути, вам нужно запустить отладчик собственного кода и посмотреть, что он вам скажет.

person Ben    schedule 15.05.2013

Вы не установили поле SetLastError в свой DllImport атрибут.

Это означает, что вы не получаете правильное значение от Marshal.GetLastWin32Error().

Измените LoadLibrary на это:

[DllImport( "kernel32.dll", CharSet = CharSet.Auto, SetLastError = true )]
static extern IntPtr LoadLibrary( string lpFileName );
person Ben    schedule 15.05.2013