0

この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)
4

3 に答える 3

3

VB6関数をとして宣言しSub、コンパイラー/インタープリターにvoid関数(プロシージャとも呼ばれます)を検索させますが、実際の関数にはint戻り型があります。

includeステートメントを次のように変更すると機能するはずです。

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

Longのすべての発生をで置き換える必要があるかもしれませんがInteger、VB6の経験が不足しているため、よくわかりません。

于 2012-01-28T19:13:10.163 に答える
0

私は宣言が正しいことを理解しました、そしてそれを呼び出す必要がある特定の方法がありました-基本的にあなたはByValとして文字列を渡す必要があります-それは私が異なるものの組み合わせを試している間ランダムに機能しました。皆様のご協力ありがとうございました。subとして宣言された場合の呼び出しは次のとおりです。

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

これが誰かに役立つことを願っています-「ByValstrUA」なしで2番目の引数を呼び出し、「strUA」を渡すだけの場合、内部関数はByRefを想定する必要があります。つまり、渡した変数(ANSI Visual Basic 6.0 STRING)、そしてもちろん、これを行うと、C関数が使用する文字列タイプがANSI Visual Basic文字列タイプではないため、ぎこちなくなります。

したがって、ByValとして渡す場合は、(参照ではなく)値で渡すだけで、使用する文字列型と互換性のある独自の変数/データ型の組み合わせを使用できます。それが誰かに役立つことを願っています。

于 2012-01-28T21:13:44.253 に答える
0
Const URLMON_OPTION_USERAGENT = &H10000001
Const URLMON_OPTION_USERAGENT_REFRESH = &H10000002

プライベート宣言関数UrlMkSetSessionOptionLib"urlmon"(ByVal dwOption As Long、ByVal pBuffer As String、ByVal dwBufferLength As Long、ByVal dwReserved As Long)As 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)

終了機能

于 2017-01-12T13:12:06.190 に答える