Как сделать «Публичную декларацию Ansi Function» в Visual Basic 6.0? - PullRequest
0 голосов
/ 28 января 2012

Я пытаюсь преобразовать это объявление VB.NET / C # в объявление Visual Basic 6.0, возникли проблемы (включена версия C #, преобразование в VB.NET не проблема):

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(
    int dwOption,
    string pBuffer,
    int dwBufferLength,
    int dwReserved);

Как вы можете видеть, в Visual Basic / C # есть та часть CharSet=CharSet.Ansi, которую я не знаю, как сделать в Visual Basic 6.0 - я попытался добавить A в конце псевдонима ... Alias "UrlMkSetSessionOptionA" ... но это не сработало (говорит can't find DLL entrypoint in urlmon.dll). Без этого строка, отправляемая в pBuffer, выглядит как бред (странные символы, которые я не могу распознать).

Вот что я получил до сих пор ...

Public Declare Sub UrlMkSetSessionOption Lib "urlmon.dll" (ByVal _
    dwOption As Long, _
    pBuffer As Any, _
    ByVal dwBufferLength As Long, _
    ByVal dwReserved As Long)

Ответы [ 3 ]

3 голосов
/ 28 января 2012

Вы объявляете функцию VB6 как Sub, заставляя компилятор / интерпретатор искать функцию void (также известную как процедура), тогда как фактическая функция имеет тип возврата int.Это должно сработать, если вы измените свое включение:с VB6 я не уверен.

0 голосов
/ 12 января 2017
Const URLMON_OPTION_USERAGENT = &H10000001
Const URLMON_OPTION_USERAGENT_REFRESH = &H10000002

Закрытое Объявление функции UrlMkSetSessionOption Lib "urlmon" (ByVal dwOption As Long, ByVal pBuffer As String, ByVal dwBufferLength As Long, ByVal dwReserved As Long) Как Integer

Открытая функция ChangeUserAgent

(Optional ByVal MyUserAgent As String = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36")

 Call UrlMkSetSessionOption(URLMON_OPTION_USERAGENT_REFRESH, vbNullString, 0, 0)

 Call UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, MyUserAgent, LenB(MyUserAgent), 0)

Функция завершения

0 голосов
/ 29 января 2012

Я только что выяснил, что объявление правильное, и был особый способ, которым его нужно было вызвать - в основном вам нужно передать строку как ByVal - это просто случайно работало, пока я пытался комбинировать различные вещи. Спасибо всем за их вклад. Вот вызов, если объявлен как sub.

UrlMkSetSessionOption URLMON_OPTION_USERAGENT, ByVal strUA, Len(strUA), 0

Надеюсь, это кому-нибудь пригодится - когда вы вызываете второй аргумент без «ByVal strUA» и просто передаете «strUA», внутренняя функция должна принять ByRef, что означает, что она пытается использовать переменную, которую мы ей передали ( ANSI Visual Basic 6.0 STRING), и, конечно, когда он это делает, он оказывается таким же бессмысленным, как тип string , который использует функция C, не является типом строки ANSI Visual Basic.

Таким образом, передавая его как ByVal, он просто передает его по значению (не по ссылке) и затем может использовать свою собственную комбинацию переменная / тип данных, которая совместима с используемым типом строки. Надеюсь, это кому-нибудь поможет.

...