C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■6857  Re[3]: PropertyGridの制御について
□投稿者/ 魔界の仮面弁士 -(2006/09/26(Tue) 17:20:54)

    分類:[C#] 

    2006/09/26(Tue) 17:22:15 編集(投稿者)

    RefreshProperties を属性指定してみるとか。
記事No.6850 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■196  Re[7]: SQL Server 2005 CLR VB2005 DBアクセス方法
□投稿者/ Jitta -(2007/01/18(Thu) 22:03:40)
>
    まとめ:
     どうも、ConnectionString の設定方法がわかってなかったらしい。
    ………あ、これで終わっちゃう。。。

     んで、次に C:\sql\... にアクセスする必要があって、ここのファイルへのアクセスでセキュリティエラーが発生。
    http://msdn2.microsoft.com/ja-jp/library/ms345101.aspx より:
    > EXTERNAL_ACCESS アセンブリの権限は、 SAFE アセンブリの権限に、ファイル、ネットワーク、環境変数、レジストリなどの外部システム リソースにアクセスできる機能を加えたものです。

     逆に言うと、SAFE であれば、ファイルへアクセスできない、と。なので、この権限を与える、と。
記事No.113 のレス /過去ログ10より / 関連記事表示
削除チェック/

■7378  WebBrowserがタイムアウト
□投稿者/ はいばら -(2007/09/04(Tue) 22:29:03)

    分類:[VB.NET/VB2005] 

    初心者です。よろしくお願いします。

    開発環境:Microsoft Visual Studio .net 2003
    OS:WindowsXP HomeEdition

    WebBrowserを使ってWebページを表示するアプリケーションを作っています。
    一応アプリは完成し、今はテストという段階です。
    開発したPC(VS2003が入っている)だと上手く表示されるのですが、他のPCでインストーラからインストールして実行すると何故かどのページも
    タイムアウトしてしまいます。

    原因を色々調べているのですがまだわかりません。

    原因がわかる方よろしくお願いします。
親記事 /過去ログ18より / 関連記事表示
削除チェック/

■18803  Re[4]: 排他処理
□投稿者/ RX-8 -(2008/05/16(Fri) 13:35:49)
    >好ましくないとありましたが実際のところはどうなのでしょうか。

    対象のオブジェクトを処理する全ての箇所でlockする必要があるとか。
    lock(排他処理)はデッドロックが起きる危険性があるとか。
    lockの中でlockを行うとその危険性が上がるとか。
    パフォーマンスが下がるとか。
    適所でlockの種類を変えた方がいいとか。

    とにかくlockはモデルをきちんと設計してよく考えて使わなければいけないと。
    そういうったことから、lock使わないで済むならその方がいいし、使わなくて済む設計にすべきだよねといった見解ではないですかね?
記事No.18767 のレス /過去ログ37より / 関連記事表示
削除チェック/

■53255  Re[1]: 流用元のDLLのリソースが呼び出されてしまう(MFC)
□投稿者/ とっちゃん -(2010/09/08(Wed) 11:22:23)
>
    No53235 (DD. さん) に返信
    > この流用元と流用先の両方のDLLを同一プロセス上で使用しているのですが、流用先DLLのリソースで定義されているString Tableの内容をCString::LoadString()で使用しようとすると、同じIDで定義されている流用元DLLのString Tableの文字列が引っ張られてくる現象が起きています。
    >
    たぶん解決できるであろう策は後述していますがそれと合わせて
    テクニカルノート
    http://msdn.microsoft.com/ja-jp/library/h6h0eact.aspx
    も熟読することをお勧めします。下記の解決策はここに書かれている知識を知っていることを
    前提としている部分が多々ありますので。




    ・MFC拡張DLLの場合
    よりどころとするCWinApp(利用元のEXEまたは、レギュラーDLL(OCXなどを含む)が持つ)に所属する
    すべてのDLLでリソース識別子を重複させないように調整する必要があります。
    原則事項ではありますがこれを行っておくことにより、意図しないリソースのロードが発生したり
    ということがなくなります。

    もし、この原則から外れなければならない(IDの枯渇などが原因で重複が避けられない
    他社製のモジュールに割り込むため調整ができない)場合は
    LoadString API や、LoadBitmap APIなどを呼び出すMFCのメソッドの呼び出し前に
    AfxSetResourceHandle() を呼び出して、ロード対象とするモジュールを特定させます。
    これにより、重複していても意図的に特定のリソースをロードすることができるようになります。

    ・レギュラーDLLの場合
    レギュラーDLLの場合は(MFCをDLLでリンクしているかどうかは無関係です)DLLのエクスポート関数の先頭に
    AFX_MANAGE_STATE( AfxGetStaticModuleSate() );
    を入れてください。
    これにより、MFCの境界が変わり、リソースのロード先などもすべて入れ替わります。
記事No.53235 のレス /過去ログ89より / 関連記事表示
削除チェック/

■68097  Re[5]: web上のボタンのクリックの処理が分からない。
□投稿者/ ジョニー -(2013/09/23(Mon) 14:02:26)
    2013/09/23(Mon) 14:27:42 編集(投稿者)

    No68096 (Azulean さん) に返信
    > この手(アカウント取得・開設に相当するもの)の自動化ってサービス提供者によっては禁止されていることもあります

    具体的にどこのサービスですか!?

    具体的にあげられないのであれば、
    憶測で物事を言うのはやめて頂きたいです。

    私は、自動化を禁止しているというのは聞いた事がありませんが、、、
    自動化でアカウント取得を沢山作りすぎるのは
    制限がかかることは聞いたことがありますが、、、
    自動化自体を禁止しているのは聞いた事がありません。

    > Blogger.com がどうかはわかりませんが、Blog 新規作成まで自動化する必要はあるのでしょうか?

    他の人にとっては、必要ないのかもしれませんが、
    私にとっては、必要としているから、
    ここに記載しているのではないでしょうか?

    必要がなければ、ここにあえて質問はしないと思います。

    それを再度、相手に尋ねるのはおかしい事と言うか
    大変失礼だと思います。

    あなたも、他の人にとって必要が無いと思われても
    自分にとって必要があるという筝はないのでしょうか?

    それに対して、他の人から
    「それって、本当に必要があるの?」
    と言われたらどう思われますか?

    気分を害しませんか?

    どこかの掲示板で、あなたの事が書かれていましたが、

    「親切心が、、、」とか言ってたような、、、

    人違いであれば、申し訳ございません。m(_ _)m

    何となく、回答が投げやりというか、、、
    何となく他の人が言っていたのが分かるような気がします。

    > ■No68095 (ジョニー さん) に返信
    >> source = source.Replace("<button class=\"blogg-button GEE3RVNDMU\" tabIndex=\"0\">新しいブログ</button>", "<input value=\"新しいブログ\" class=\"custom-button\" type=\"submit\" />");
    >
    > source 変数はあくまで WebBrowser から取得した文字列に過ぎません。
    > source 変数の内容を書き換えても WebBrowser には何も影響しないのでご注意ください。

    以前、別のプログラムで、
    これと同じように、nameもidもvalueも無い場合に
    sourceのreplaceで
    きちんとwebBrowser上で反映されたのですが、
    これは何故でしょうか?

    本当に影響は無いと言えるのでしょうか?


    > もし、探すのであれば button で探すべきかと。

    下記のHTML
    <button tabindex="0" class="blogg-button GEE3RVNDMU">新しいブログ</button>
    に対して、

    replaceを取り外して、
    source変数を使わずに、
    次の様に修正してみましたが、
    残念ながら、ボタンをクリックすることは不可能でした。

    他に方法があれば、是非ソースを記載して
    教えてください。

    HtmlElementCollection elements = webBrowser1.Document.GetElementsByTagName("button");//
    foreach (HtmlElement element in elements)
    {
    if (element.InnerText == "新しいブログ")
    {
    element.InvokeMember("click");
    break;
    }
    }


    よろしくお願いします。m(_ _)m
記事No.68089 のレス /過去ログ115より / 関連記事表示
削除チェック/

■70112  Re[1]: ウィンドウの常時最前面表示について
□投稿者/ らうむ -(2014/02/25(Tue) 10:20:54)
    すいません。自己解決できました。
    C++でSetWindowPosでやってたことがありました。
記事No.70111 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■91254  Re[7]: WebからpdfファイルをDLし、PCに保存がしたいです。
□投稿者/ キングダム -(2019/06/08(Sat) 18:20:15)
記事No.91238 のレス /過去ログ157より / 関連記事表示
削除チェック/

■91256  Re[8]: WebからpdfファイルをDLし、PCに保存がしたいです。
□投稿者/ おぐおぐ -(2019/06/08(Sat) 22:22:08)
    No91254 (キングダム さん) に返信
    > わからんですなー
    > 参考になりそうな情報探ってみました
    >
    > App.configに設定を追加するとWebのリクエストをログファイルに出力できるみたいです
    >
    > The request was aborted: Could not create SSL/TLS secure channel
    > https://windows-hexerror.linestarve.com/q/so12317771-The-request-was-aborted-Could-not-create-SSLTLS-secure-channel

    キングダム様
    たびたび有難うございます。

    App.configに組み込んでログを出したところ、500行に及ぶログが出てきました。
    この結果をどう解析すれば良いのか、正直いまの私では分からないです。。。

    どういった点に着目すれば良いのか、教授頂ければ幸いです。
    場合によってはログを添付した方が良いでしょうか。

    > エラーメーセージでググったら対応方法まとまってました
    >
    > c# httpclient : 要求が中止されました:SSL / TLSのセキュアなチャネルを作成できませんでした
    > https://code-examples.net/ja/q/2ba30e

    私が調査していた範囲で、ご紹介のサイトまでは見ておりませんでしたが、大体調べた内容と
    大きな違いは無いかなという印象でした。

    .NET Frameworkはデフォルトで4.5.2ですので、レジストリの変更は必要無いかな?と思いつつ
    本音はレジストリを変更するのが少し怖いです。

    あと今までの相違部分としては

    Net.ServicePointManager.Expect100Continue = True
    Net.ServicePointManager.DefaultConnectionLimit = 9999

    くらいでしたが、組み込んでも結果は変わらずエラーとなりました。。。
記事No.91238 のレス /過去ログ157より / 関連記事表示
削除チェック/

■92208  Re[4]: Marshal.StructureToPtrで落ちる
□投稿者/ 魔界の仮面弁士 -(2019/09/02(Mon) 03:27:37)
    2019/09/02(Mon) 04:15:36 編集(投稿者)

    No92186 (いとこんにゃく さん) に返信
    > <DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)>
    > Private Shared Function OpenPrinter(

    Declare 宣言と DllImport 属性指定が混在しているので不揃いな印象を受けましたが、それはさておき。


    問題点は 2 つあります。一つ目は、CharSet の取り扱いが出鱈目であること。


    OpenPrinter の宣言を見ると、CharSet.Auto が指定されていますので、Win7 にしても Win10 にしても、
    Unicode 版である OpenPrintW API が呼び出されることになりますね。

    > Private Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter As IntPtr,
    > ByVal Level As Integer, ByRef pPrinter As PRINTER_INFO_2, ByVal Command_Renamed As Integer) As Boolean

    一方こちらは、Unicode 版の SetPrinterW ではなく、ANSI 版である SetPrinterA API を呼び出しているようです。
    その上で、上記 API で使われる構造体は、CharSet.Auto が指定されてしまっています。これは不自然でしょう。

    > <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
    > Friend Structure PRINTER_INFO_2

    さらに加えて、GetPrinter API の宣言では、CharSet 指定なしになっています。これも不揃いですね。
    省略した場合、CharSet.Ansi の呼び出しを意味します。
    > <DllImport("winspool.drv", SetLastError:=True)>
    > Private Shared Function GetPrinter(


    文字列処理を伴う API の多くは、〜W 系と 〜A 系の二種類を持ちますが、
    CharSet 指定はいずれかに揃えておかねばなりません。

    加えて述べれば、現状の環境において "〜A" 系の API に揃えるメリットはほぼありません。
    昔の Windows には W 系を実装していない物もありましたが、現行のものは全て W 系を実装していますので、
    基本的には Auto 指定、手抜き実装で済ますなら Unicode 指定で統一するのが良いでしょう。
    http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
    http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html


    ということで、今回の場合、
    > Private Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (
    ではなく、
     Private Declare Unicode Function SetPrinter Lib "winspool.drv" Alias "SetPrinterW"
    あるいは
     Private Declare Auto Function SetPrinter Lib "winspool.drv" (
    にされることをお奨めします。(他が Auto 指定なので後者を推奨)

    また、GetPrinter の宣言についても、CharSet.Auto を付与しておく必要があります。
    ※ DllImport を使うか Declare を使うかはお好みで。



    もう一つの問題点はこの部分。

    > Marshal.StructureToPtr(MyDevMode, pFullDevMode, True)
    > PrinterInfo.pDevMode = pFullDevMode
    > Marshal.StructureToPtr(PrinterInfo, pPrinterInfo, True) ←■■■■ここでアプリが落ちます!!

    第三引数に True を指定するという事は、データをコピーする前に、サブ構造体や参照が
    解放されるという事です。今回のケースで Trueを指定すべきでは無いと思います。

    https://stackoverflow.com/questions/3339979/marshal-structuretoptr-crashes-visual-studio
    https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.marshal.structuretoptr?view=netframework-4.8
    https://docs.microsoft.com/ja-jp/dotnet/framework/interop/copying-and-pinning?view=netframework-4.8

    あるいはメモリをピン留めしておいて、該当メンバーの位置を Marshal.WriteInt16 等で直接書き換える手法もあるかも。


    とりあえず大きな問題点はそれぐらいですが、他にも気になる点があるので
    見つけたものを挙げておきます(直ちに問題とはならない軽微なミスも含みますが)。

    No92179 では、ClosePrinter や Marshal.FreeHGlobal の呼び出しが見当たりませんでしたが、
     大丈夫でしょうか。(恐らく Finally 句で処理されていると思いますが)

    ・PrinterInfo = CType(Marshal.PtrToStructure(pPrinterInfo, GetType(PRINTER_INFO_2)), PRINTER_INFO_2)
     を実行した直後に一時停止して、構造体の文字列メンバーに正しい値が入っているかを
     確認してください。ここが文字化けしているようだと NG です。
     さらに言えば、プリンター名に「Shift_JIS に無い Unicode 文字」を付けておいた状態で
     正しく呼び出せるようになっていることが望ましいです。

    ・今回のケースでは PRINTER_ALL_ACCESS 権限でのフルアクセスが指定されていますが、
     強い権限が必要な場合、管理者モードでの実行が必要になるかもしれません。
    https://social.msdn.microsoft.com/Forums/ja-JP/c1fc9393-a707-4f7c-b801-0de340cd3888/1247912540125111249012523-12469125401249912473?forum=vbgeneralja

    ・OpenPrinter の第二引数が「ByRef hPrinter As IntPtr」であるのに対して、
      No92179 ではそこに、「Dim PrinterHandle As Long」が渡されているのは誤りですね。
     今回は x86 ビルドだそうなので、Long 型の出番はほぼ無いはず。
     IntPtr 型の変数を渡すようにしましょう。※あるいは SafeHandle 派生クラスを使う手法もあり。

    ・OpenPrinter の戻り値を「As Boolean」としているにもかかわらず、
      No92179 ではそれを「Dim Result As Long」で受けています。Boolean に揃えましょう。
     (API を扱うなら、Option Strict On でコンパイルが通るようにコーディングすべき)

    ・GetPrinter の第三引数が「ByVal hPrinter As IntPtr」であるのに対して、
     「GetPrinter(PrinterHandle, 2, 0, 0, Needed)」と、Integer の 0 を渡しています。
     ここには IntPtr.Zero が渡されるべきかと。

    ・GetPrinter の第四引数である「_In_ DWORD cbBuf」を「ByVal cbBuf As Integer」に
     翻訳したのに対し、PRINTER_INFO_2 構造体の「DWORD Attributes」以降のメンバーは
     「As System.UInt32」で宣言されている点が気にかかりました。
     DWORD を Integer / UInteger / Int32 / UInt32 のいずれで受けるかは任意ですが、
     明確に使い分けているわけでは無さそうなので、コードに不揃い感があります。

    ・「If MyDevMode.dmFields And DM_COPIES Then」ではなく
     「If (MyDevMode.dmFields And DM_COPIES) <> 0 Then」などとしましょう。
     あるいは dmFields を <Flags> な Enum 型で宣言した上で、
     MyDevMode.dmFields.HasFlags( ) でビットフラグを判定する手法もあります。
記事No.92179 のレス /過去ログ159より / 関連記事表示
削除チェック/

■95697  Re[2]: Access2013による大量データ計算について
□投稿者/ くまくま -(2020/09/03(Thu) 18:30:27)
    大谷刑部さん
    shuさん
    ご返事ありがとうございます。

    ます緯度経度情報の計算がDecimalで行っているのは
    ここには書いていませんが「緯度経度」から「メッシュコード」への逆変換で結果が異なってしまう事が確認された為です
    「緯度経度」データ自体の精度としてはDoubleで問題なさそうなのですが
    本当に問題ないかは全データで試さなくてはならず、そうすると検証に2日以上かかってしまいます。

    そこからチューニング等を行って再度確認の繰り返しを考えると、いつ終わるかわからない為相談させていただいた次第です。
    (このような処理がまだ10種類以上待っています。)

    処理に関して「ミリ秒」単位で計測していたのですが判りませんでしたが
    shuさんの計算で「62マイクロ秒」という事が判ったので塵も積もればですね

    やはりVB.netに変更するほうがよさそうですね...

    一応もう少しご意見を伺いたいので「解決済み」は保留としておきます。
記事No.95685 のレス /過去ログ166より / 関連記事表示
削除チェック/

■99847  Re[7]: IHTMLDocumentオブジェクトの取得に関して
□投稿者/ 魔界の仮面弁士 -(2022/06/13(Mon) 13:19:39)
    No99825 (はなみ さん) に返信
    > IID_IHTMLDocumentの何たるかは非常によくわかりました。
    > 継承されていて下位互換であれば、IID_IHTMLDocument8 のみを使えば良いとの
    > 認識でよろしいでしょうか。

    それでも良いですが、vtable 指定で直接呼び出す場合でもない限り、IHTMLDocument8 の
    直接指定が必要になる場面はあまり無いかと思います。

    そもそも IHTMLDocument8 の出番はさほど多くありません。MSHTML を参照設定する場合でも、
    GAC にインストールされている Microsoft.mshtml.dll を使う場合には、
     As IHTMLDocument6
     As IHTMLDocument7
     As IHTMLDocument8
    は宣言できないからです。というのも、
    C:\Windows\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.mshtml.dll
    には IHTMLDocument 〜 IHTMLDocument5 までしか定義されていないためです。

    このフォルダー名にある 7.0.3300 というバージョン番号は、2002 年登場の .NET Framework 1.0 世代を意味します。
    ※時代背景としては:IE5.5 リリースが 2000年夏/IE6 リリースが 2001年夏/IE7 が 2006年秋

    そして GAC (グローバル アセンブリ キャッシュ)に登録されている
    PIA (プライマリ相互運用アセンブリ)の Microsoft.mshtml.dll の中身は
    それ以降更新されていない模様( DLL へのデジタル署名の更新は行われていますが)。

    なので、どうしても IHTMLDocument6〜IHTMLDocument8 を用いたい場合には、
     "C:\Windows\System32\mshtml.tlb"
     "C:\Windows\SysWOW64\mshtml.tlb"
    のタイプライブラリから相互運用アセンブリを生成してそれを用いるか…
    もしくは同等の COM Interface を自前で宣言しておく必要が
    あったりするのですが…それは今回関係ないことなので置いといて:


    今回のケースでは、COM オブジェクトを得られれば良いだけなので、
    対象のオブジェクトで実装されている COM インターフェイスであれば何でも構いません。

    何でも良いとはいえ、今回のように "Internet Explorer_Server" から辿ってきていて、
    しかもそのオブジェクトが HTML 文書であることも初めから分かっているようなケースでは、
     Const IID_DispHTMLDocument As String = "{3050F55F-98B5-11CF-BB82-00AA00BDCE0B}"
     Const IID_IHTMLDocument2 As String = "{332c4425-26cb-11d0-b483-00c04fd90119}"
     Const IID_IHTMLDocument As String = "{626FC520-A41E-11cf-A731-00A0C9082637}"
    あたりのいずれかを明示しておけばよいでしょう。

    なお、IE4 の時点では既に IHTMLDocument2 が使われていたと記憶しています。
    IHTMLDocument は IE3.02 あたりの古代技術だったかな…? (当時の資料が手元に無いので未確認)


    ちなみに InternetExplorer オブジェクトや WebBrowser オブジェクトの
    Document プロパティから受けとる場合、そこから得られるのは必ずしも HTML Document とは限りません。
    状況によっては PDF や Word などの「ActiveX ドキュメント」のインスタンスが返されることもありえます。
    そのような状況では、デュアルインターフェイスを期待して
    IDispatch ({00020400-0000-0000-C000-000000000046}) で受けたり、あるいは
    すべての COM オブジェクトが実装している
    IUnknown ({00000000-0000-0000-C000-000000000046}) でも得たりしてから
    事後判定で分岐処理したりすることもありますが…こちらも今回は気にしなくて良いでしょう。



    もしも ObjectFromLresult を呼ぶ際に、無関係のインターフェイス ID が指定された場合は、
    最後のオブジェクト引数に Nothing がセットされます。その場合、API の戻り値としては
    Const E_NOINTERFACE As Integer = &H80004002 'インターフェイスがサポートされていません
    が返されることになります。

    なお手元の環境では、IHTMLDocument2 等で取得した後の Object に対して
     S1 = TypeName(doc) '"HTMLDocumentClass"
     S2 = doc.GetType().FullName '"mshtml.HTMLDocumentClass"
     S3 = doc.GetType().GUID '"{25336920-03F9-11cf-8FD0-00AA00686F13}"
    といった結果が得られました。これは HTML Document の COM クラスだということですね。
    (HKEY_CLASSES_ROOT\CLSID\{25336920-03F9-11cf-8FD0-00AA00686F13})


    > 'アドレスを取得
    > Dim pAddress As IntPtr = gch.AddrOfPinnedObject().ToInt32
    …ドウシテ…?

    AddrOfPinnedObject メソッドの戻り値は IntPtr 型ですよね。。。
    それを ToInt32 メソッドで Integer 型へと明示的に変換してから、
    さらに暗黙の型変換で、IntPtr 型へ復元した上で代入させている…?? 何故???


    > これでも取得することができました。(あまり意味は無いようですが)
    > 'GUID変換
    > Dim int As Integer = CLSIDFromString(pAddress, IID_IHTMLDocument_GUID)
    > If int = 0 Then
    >  intRet = ObjectFromLresult(lpdwResult, IID_IHTMLDocument_GUID, 0, ppvObject)
    > End If

    混乱の元なので、『Dim int As Integer』は避けた方がよろしいかと。

    文法的には正しいのですが、"int" という名は、VB 組み込みの
    Int 関数(Microsoft.VisualBasic.Conversion.Int メソッド)と混同しやすいですから。

    それに CLSIDFromString の戻り値は【BOOL】型です。
    https://docs.microsoft.com/ja-jp/windows/win32/shell/guidfromstring

    BOOL なので 32bit 整数型であるのは確かですが、API 宣言側は「As Integer」よりも
    「As <MarshalAs(UnmanagedType.Bool)> Boolean」の方が直接的な宣言と言えます。

    これが VBA だと、As Boolean (これは 16bit の型) とは書けずに As Long で宣言されますが、
    それに引っ張られて、VB.NET でも As Integer で宣言されてしまうケースはありますけれどね。

    で…一番の問題は、その後の「If int = 0 Then」の行。
    CLSIDFromString の戻り値は
      GUID が正常に作成された場合は ≠ 0 (すなわち TRUE)
      GUID を生成できなかった場合は = 0 (すなわち FALSE)
    と返す仕様なので、むしろ真偽が逆になっているように見えました。
    でも、はなみさんはそれで取得できているんですね…?


    > If lpdwResult <> IntPtr.Zero Then
    >   …中略…
    >   Dim int As Integer = CLSIDFromString(pAddress, IID_IHTMLDocument_GUID)
    >   If int = 0 Then
    >     intRet = ObjectFromLresult(lpdwResult, IID_IHTMLDocument_GUID, 0, ppvObject)
    >   End If
    >   …中略…
    >   Return ppvObject
    > End If

    それだと、Else 句到達時に Return を通らないため、
    エラーにはならないものの、BC42105 の警告が生じます。

    先に述べたように、あらかじめ戻り値の初期値として
     GetHTMLDocument = Nothing
    をセットしておけば警告は出ませんが、それよりも、

     Dim ppvObject As Object = Nothing
     …中略…
     If lpdwResult <> IntPtr.Zero Then
      …中略…
      If CLSIDFromString(pAddress, IID_IHTMLDocument_GUID) Then
        Dim hResult = ObjectFromLresult(lpdwResult, IID_IHTMLDocument_GUID, 0, ppvObject)
        If hResult <> 0 Then
         ' Marshal.ThrowExceptionForHR(hResult)
        End If
      End If
      …中略…
     End If
     Return ppvObject

    のようにして、最後の「Return ppvObject」を通るようにしておいた方が統一感があるかと思います。
    実際には CLSIDFromString を使う必要も無いので、もう少し簡略化できますけれども。



    >>『ReDim x(0 To 1) As Currency』あるいは『ReDim x(0 To 1) As LongLong』で
    >>128bit の領域を直接確保しておき、そこに GUID 値相当のマジックナンバーを
    > 64bit×2で128bit!…このような領域確保のしかたもあるんですね!
    > それぞれのIHTMLDocumentのバージョンを指定する場合はどのように実装すれば良いのでしょう?

    …? 質問の意味がよく分かりませんでした。

    IHTMLDocument8 とか IHTMLDocument2 とかの選び方の事だとしたら、
    今回の回答の冒頭で概要だけ述べてみたので、そちらを読んでください。
    VB.NET 向けの話として書いてはいますが、VBA でも基本は一緒です。


    それとも、VBA で 128bit の変数に IHTMLDocument の IID を指定する実装手順のことでしょう。

    VBA だと 128bit サイズの組み込み型が無いので、ユーザー定義型もしくは配列で代用されます。
    Byte×16 でも Integer×8 でも Long×4 でも、いずれも 128bit。
    http://www.hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?no=3912&reno=3911&oya=3901&mode=msgview

    (0 To 3) As Long にマジックナンバーを直接投入するパターンならこんな感じ。
    https://www.petitmonte.com/bbs/answers?question_id=19776

    (0 To 1) As Currency にマジックナンバーを直接投入するパターンもあります。
    https://gist.github.com/Benshi/2057bbea3825b64b017dbc9e5dd54589

    String → CLSIDFromString API → (0 To 1) As Currency パターンや
    ユーザー定義型(Type UUID)にマジックナンバーを直接投入するパターンならこんな感じ。
    https://social.msdn.microsoft.com/Forums/vstudio/en-US/c0765a67-b8ba-40dc-ac52-aac7be9f1d6a/ie123981246912509125401248812364202224180626376152608512395320662?forum=vbajp
記事No.99815 のレス /過去ログ174より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -