C#LoadLibrary ERROR_NO_TOKEN

时间:2013-05-15 12:47:55

标签: c# loadlibrary kernel32

我正在加载一个带有依赖关系的MFC dll(假设我在C#中加载D.dll,它依赖于C.dll,B.dll和A.dll)。 这是我的代码:

[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的路径是正确的。

2 个答案:

答案 0 :(得分:2)

您尚未在SetLastError属性上设置DllImport字段。

这意味着您无法从Marshal.GetLastWin32Error()获得正确的值。

将LoadLibrary更改为:

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

答案 1 :(得分:1)

代码ERROR_NO_TOKEN通常意味着有人试图在没有模仿的线程上调用OpenThreadToken。这可能是一个问题,也可能不是问题 - 这只是SetlastError要记录的最后一个错误代码。

此调用可能位于DllMain的{​​{1}},也可能位于依次引用的任何库的Interfaccia_C_2005.dll中。他们为什么需要这样做并不是很明显,但这是可能的。

此外,这可能不是导致失败的实际错误。除其他原因外,如果DllMain的{​​{1}}或任何依次引用的库的LoadLibrary返回false,DllMain将失败。如果DllMain返回false,而不调用Interfaccia_C_2005.dll,则GetLastError将显示 上一个 错误,无论它是什么。例如,系统可能非常高兴DllMain失败,但其他一些错误,没有调用SetLastError

基本上你需要启动Native Code调试器,看看它告诉你什么。