2013-11-06 6 views
0

Учитываяkernel32.GetDllDirectory возвращает ошибку (0) при вызове через PInvoke

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
static extern int GetDllDirectory(int nBufferLength, StringBuilder lpPathName); 

StringBuilder tmp = new StringBuilder(10240); 
if (GetDllDirectory(10240, tmp) == 0) 
{ 
int err = Marshal.GetLastWin32Error(); 
} 

MSDN утверждает that

Если функция завершается успешно, возвращаемое значение длины строки копируется для lpBuffer, в символах.

Я принимаю 0, ошибка 0 тоже. Что может быть неправильно?

+1

Не является ли показатель 0 успешным? – spender

+2

@spender, no, http://msdn.microsoft.com/en-us/library/windows/desktop/ms683186(v=vs.85).aspx - Если функция завершается успешно, возвращаемое значение - это длина строка скопирована в lpBuffer, в символах. –

+0

@ScottChamberlain, возвращаемое значение: false, tmp пусто –

ответ

2

Значение по умолчанию для каталога DLL пуст. Возвращаемое значение нуля, которое вы видите, просто говорит вам, что ничего не получить.

Вам нужно установить каталог DLL, чтобы вы могли ожидать GetDllDirectory, чтобы вернуть что-либо, кроме нуля. Добавьте звонок до SetDllDirectory, прежде чем позвонить GetDllDirectory, чтобы убедить себя в этом. Или попробуйте позвонить из простой программы на C++, а также наблюдать за тем же самым поведением.

Документация, безусловно, вводит в заблуждение здесь. Я не уверен, как вы отличаете фактический отказ от того, что значение не задано. Возможно, GetLastWin32Error() вернет ненулевое значение в случае ошибки. Тем не менее, очень мало режимов отказа. Лично я был бы склонен относиться к нулю, поскольку это означает, что каталог DLL не имеет значения.

+0

Вероятно, нужно использовать 'SetLastError' или что-то в этом роде. – Mehrdad

+0

SetDllDirectory C# PInvoke Подпись: http://www.pinvoke.net/default.aspx/kernel32.setdlldirectory –

+0

Да SetDllDirectory так же просто, как и получается. Я уверен, что @ kagali-san может это исправить! –

Смежные вопросы