Еще одна причина, возможно, ваш URL-адрес включает некоторые скрытые символы, такие как «\n».
Если вы определяете свой url, как показано ниже, это исключение будет повышаться:
url = '''
http://google.com
'''
, потому что в строке есть '\n' hide. Фактически, URL-адрес становится:
\nhttp://google.com\n
__stdcall
соглашение о вызовах, используемое для функции. Это говорит компилятору правила, которые касаются установки стека, продвижения аргументов и получения возвращаемого значения.
существует много других соглашений о вызовах, __cdecl
, __thiscall
, __fastcall
и замечательно именованы __naked
. __stdcall
стандартное соглашение о вызовах для системных вызовов Win32.
Википедия покрывает детали .
, прежде всего, имеет значение, когда Вы вызываете функцию за пределами своего кода (например, API ОС), или ОС звонит Вам (как имеет место здесь с WinMain). Если компилятор не будет знать корректное соглашение о вызовах затем, то Вы, вероятно, получите очень странные катастрофические отказы, поскольку стеком не будут управлять правильно.
C или сам C++ не определяют те идентификаторы. Они - расширения компилятора и поддерживают определенные соглашения о вызовах. Это определяет, куда поместить аргументы, в том, какой порядок, где вызванная функция найдет обратный адрес и так далее. Например, __ fastcall означает, что аргументы функций передаются по регистрам.
Статья Википедии предоставляет обзор различных соглашений о вызовах, найденных там.
Ответы до сих пор касались деталей, но если Вы не предназначаете к выпадающему к блоку, затем все, что необходимо знать, то, что и вызывающая сторона и вызываемый должны использовать то же соглашение о вызовах, иначе Вы получите ошибки, которые трудно найти.
document.body
также короче, чтобы ввести и быстрее выполниться, чем document.getElementsByTagName("head")[0]
и избегает проблем перекрестного браузера insertRule/addRule.
– Ben Blank
2 April 2009 в 17:05
Я соглашаюсь, что все ответы до сих пор корректны, но вот причина. C Microsoft и компиляторы C++ предоставляют различные соглашения о вызовах для (намеченной) скорости вызовов функции в и функциях C++ приложения C. В каждом случае вызывающая сторона и вызываемый должны договориться который соглашение о вызовах использовать. Теперь, сам Windows обеспечивает функции (API), и они были уже скомпилированы, поэтому когда Вы называете их, необходимо соответствовать им. Любые вызовы к Windows APIs и обратные вызовы из Windows APIs, должны использовать __ stdcall конвенция.
Это имеет отношение, как функция вызвана - в основном порядок, в котором вещи поставились стек и кто ответственен за очистку.
Вот документация, но это не означает много, если Вы не понимаете первую часть:
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx
__stdcall используется для помещения аргументов функции в стек. После завершения функции он автоматически освобождает память. Это используется для фиксированных аргументов.
void __stdcall fnname ( int, int* )
{
...
}
int main()
{
CreateThread ( NULL, 0, fnname, int, int*...... )
}
Здесь fnname имеет аргументы, которые он непосредственно помещает в стек.