DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 親記事をトピックトップへ ]

このトピックに書きこむ

過去ログには書き込み不可

■33372 / inTopicNo.1)  Re[15]: C#で作成したDLLがVB6.0で利用できない
  
□投稿者/ Jun 一般人(8回)-(2016/05/13(Fri) 13:24:09)
http://Windows10
  • アイコンNo33369に返信(魔界の仮面弁士さんの記事)
    > どうやら、トップウィンドウであっても、そのウィンドウが非表示だと
    > エラーになるようです。

    エクセル(VBA)で試してOK、VB6.0の新規プロジェクトでもOKだった
    ので、たぶん自分のプログラムに問題があるのだと思っていましたが…

    結果的に再現確認できました。
    どうやらTimerで処理させていたのがまずかったみたいですね。
    初期状態でIntervalを0にし、Activateしたときに間隔設定をしたら
    エラーが出なくなりました。

    なぜタスクビューを監視する必要が出たかというと、ビュー画面を切り
    替えたとき SetWindowPosで最前面化していたフォームが残ってしまい
    これを非表示にしたかったのです。

    おかげさまで完璧に解決済みとなりました。
    魔界の仮面弁士さんのすごさには感動します^^
    ありがとうございました。m(_ _)m

解決み!
引用返信 削除キー/
■33369 / inTopicNo.2)  Re[14]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ 魔界の仮面弁士 大御所(1027回)-(2016/05/12(Thu) 10:19:21)
  • アイコンNo33367に返信(魔界の仮面弁士さんの記事)
    > なお、この検証はコンパイルした EXE から行ってみてください。開発環境から実行した場合には、
    > ウィンドウクラス名が異なっていたような気もしますので(ThunderMain だったかな?)。うろ覚えですみません。

    Win7 + VB6 環境を用意して、クラス名を確認してみました。

    【デバッグ 実行の場合】
     フォームウィンドウ:"ThunderFormDC"
     メインウィンドウ:"ThunderMain"

    【EXE 実行の場合】
     フォームウィンドウ:"ThunderRT6FormDC"
     メインウィンドウ:"ThunderRT6Main"



    No33368に返信(Junさんの記事)
    > トップレベルだとは思いますが一応やってみました。

    VB6 開発環境入りの Windows 10 は用意できなかったので、
    Win7 で作成した VB6 製 EXE を Win10 環境に持ち込んで
    動作テストしてみました。


    どうやら、トップウィンドウであっても、そのウィンドウが非表示だと
    エラーになるようです。


    【正しく True / False が返される場合】
    ・Excel の Application.Hwnd を渡した場合
    ・ThunderRT6FormDC のハンドルを渡した場合



    【0x8002802b のエラーになるパターン】
    ・Excel の Application.Hwnd を渡しているが、
     Application.Visible = False にしていた場合
    ・ThunderRT6FormDC のハンドルを渡したが、
     そのフォームが非表示である場合
    ・ThunderRT6Main のハンドルを渡した場合
引用返信 削除キー/
■33368 / inTopicNo.3)  Re[13]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ Jun 一般人(6回)-(2016/05/07(Sat) 14:32:42)
http://Windows10
  • アイコン
    No33367に返信(魔界の仮面弁士さんの記事)
    > 試しに、フォーム "Form1" の ThunderRT6FormDC なウィンドウハンドル(要するに Me.hWnd) ではなく、
    > 
    > 具体的には GetWindowLong に GWL_HWNDPARENT を渡して最上位ウィンドウまでのチェーンを辿るか、
    > 例)https://support.microsoft.com/en-us/kb/259673
    > なお、この検証はコンパイルした EXE から行ってみてください。開発環境から実行した場合には、
    > ウィンドウクラス名が異なっていたような気もしますので(ThunderMain だったかな?)。
    
    トップレベルだとは思いますが一応やってみました。
    
        Dim nRet         As Long
        Dim nMainhWnd    As Long
        nRet = GetWindowLong(Me.HWND, GWL_HWNDPARENT)
        Do While nRet
           nMainhWnd = nRet
           nRet = GetWindowLong(nMainhWnd, GWL_HWNDPARENT)
        Loop
        
        Dim c As VirtualDesktopManager
        Set c = New VirtualDesktopManager
        If c.IsWindowOnCurrentVirtualDesktop(nMainhWnd) Then
            MsgBox "OK"
        End If
    
    このようにしてみましたが、やはりエラーが出ます。
    ※コンパイル実行しました。
    
    >>※なぜにエラーを発生させているのでしょうか ・・・
    > IsWindowOnCurrentVirtualDesktop メソッドの戻り値の説明文を見てください。
    > https://msdn.microsoft.com/en-us/library/windows/desktop/mt186442.aspx
    
    つまり、エラー処理して対応しなさいということですね。
    
    自作プログラム的には未解決ですが、当初のスレ題目の「C#で作成したDLLがVB6.0で利用できない」
    は一応解決(参照は出来た)ということで一端切り上げようと思います。
    話がそれてしまい誠に申し訳ないです。
    
    魔界の仮面弁士さんには色々勉強させていただきました。
    VB6.0でこんな細かいところまで踏み込めるとは思っていませんでしたので、改めて勉強したいと思います。
    
    ありがとうございました。
    
    

解決み!
引用返信 削除キー/
■33367 / inTopicNo.4)  Re[12]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ 魔界の仮面弁士 大御所(1026回)-(2016/05/07(Sat) 03:43:34)
  • アイコン
    No33366に返信(Junさんの記事)
    > 実行時エラー'-2147319765(8002802b)'
    > オートメーションエラーです。
    > 要素が見つかりません。
    
    引数に渡した値が、トップレベルウィンドウの HWND ではなかった場合、
    実行時エラーが発生します。
    
    
    アプリケーションを別の仮想デスクトップに表示させようとした場合、
    フォーム ウィンドウ単位で表示先を切り替えるさせることはできず、
    アプリケーション全体での切り替えになりますよね。
    
    
    ですから、スタートアップフォームの hWnd プロパティを渡しても拒絶されてしまったのだと思います。
    本来指定するべきは、アプリケーションのメインウィドウのハンドルなのでしょう多分おそらくもしかして。
    
    
    現時点で手元に VB6 環境がないため確証は持てませんが、
    試しに、フォーム "Form1" の ThunderRT6FormDC なウィンドウハンドル(要するに Me.hWnd) ではなく、
    アプリケーション "Project1" の ThunderRT6Main なウィンドウハンドルを渡してみては如何でしょうか。
    これは App.Title の文字列をタイトルとして持つ、非表示のトップレベルウィンドウです。
    
    
    具体的には GetWindowLong に GWL_HWNDPARENT を渡して最上位ウィンドウまでのチェーンを辿るか、
    例)https://support.microsoft.com/en-us/kb/259673
    もしくは、FindWindow API を使って ThunderRT6Main クラスのウィンドウを直接取り出すかです。
    例)https://support.microsoft.com/ja-jp/kb/185730
    
    
    
    なお、この検証はコンパイルした EXE から行ってみてください。開発環境から実行した場合には、
    ウィンドウクラス名が異なっていたような気もしますので(ThunderMain だったかな?)。うろ覚えですみません。
    
    
    > ※なぜにエラーを発生させているのでしょうか ・・・
    IsWindowOnCurrentVirtualDesktop メソッドの戻り値の説明文を見てください。
    https://msdn.microsoft.com/en-us/library/windows/desktop/mt186442.aspx
    
    このメソッドは、成功時には S_OK (値としては &H0 ) を返すのですが、
    失敗すると、0 以外の HRESULT コードを返すようになっています。
    
    
    そしてこのメソッドに限らず、ほとんどの ActiveX オブジェクトは、
    処理の成否を HRESULT 値として返却する仕様になっています。
    そしてこれは、VB6 にとっては「実行時エラー」を意味します。
    
    HRESULT については下記を参照。
    http://www.usefullcode.net/2007/03/hresult.html
    
    
    
    ライブラリを『参照設定』して使う場合は、呼び出し失敗時に実行時エラーとなってくれるのですが、
    今回は参照設定せずに、DispCallFunc API を通じて COM のメソッドを直接呼び出しているため、
    実行時エラーを発生させるための処理すなわち Err.Raise の呼び出しも、自分自身で行う必要があるわけです。
    
    
    
    ちなみに今回のエラーは、WinError.h にて下記のように定義されています。
    
    //
    // MessageId: TYPE_E_ELEMENTNOTFOUND
    //
    // MessageText:
    //
    // Element not found.
    //
    #define TYPE_E_ELEMENTNOTFOUND           _HRESULT_TYPEDEF_(0x8002802BL)

引用返信 削除キー/
■33366 / inTopicNo.5)  Re[11]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ Jun 一般人(5回)-(2016/05/06(Fri) 20:32:32)
  • アイコン
    No33365に返信(魔界の仮面弁士さんの記事)
    > であれば、API 側を Alias せず、そのまま GetObjectW / GetObjectA として
    > 呼び出すようにするか、
    
    これで切り分けは問題なく出来ました。
    但し、新たな問題が発生しました。
    
    Public Function IsWindowOnCurrentVirtualDesktop(ByVal topLevelWindow As Long) As Boolean の Err.Raise hr で発生します。
    
    実行時エラー'-2147319765(8002802b)'
    オートメーションエラーです。
    要素が見つかりません。
    
    と出ます。
    ※なぜにエラーを発生させているのでしょうか ・・・
    
    > 参照設定はできたのですね。
    > VB 側の呼び出し部のコードはどうなっていますか?
    
        Dim obj As ClassLibrary1.Class1
        Set obj = New ClassLibrary1.Class1
        If obj.IsVirtualDesktop(Me.HWND) Then
          MsgBox "OK"
        End If
    
    このようにしています。
    DLLの作成に問題があるのかもしれません。
    

引用返信 削除キー/
■33365 / inTopicNo.6)  Re[10]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ 魔界の仮面弁士 大御所(1025回)-(2016/05/05(Thu) 23:48:49)
  • アイコンNo33362に返信(Junさんの記事)
    >>API の GetObject 関数ではなく、
    >>VB6 / VBA の標準関数の GetObject を呼び出してください。
    > APIですでに使用していまして ・・・

    であれば、API 側を Alias せず、そのまま GetObjectW / GetObjectA として
    呼び出すようにするか、もしくは、VB 側の GetObject 関数の呼び出しを
    Interaction.GetObject のようにモジュール名付きで呼び出してみてください。


    > 切り分け出来るかやってみます。
    別案としては、COM オブジェクトの生成部分を CoCreateInstance API に切り替えるとか。


    > その他の手順を踏んでやってみると参照は出来ましたが、
    参照設定はできたのですね。
    VB 側の呼び出し部のコードはどうなっていますか?
引用返信 削除キー/
■33362 / inTopicNo.7)  Re[9]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ Jun 一般人(4回)-(2016/05/02(Mon) 21:22:52)
  • アイコンNo33360に返信(魔界の仮面弁士さんの記事)
    > ようするに、
    >>Public Function IsWindowOnCurrentVirtualDesktop(ByVal topLevelWindow As Long) As Boolean
    > を呼び出せば良いということです。

    了解です^^;

    >>本体の標準モジュールで下記のように宣言しています。
    > GetObjectA の Declare は不要です。
    > API の GetObject 関数ではなく、
    > VB6 / VBA の標準関数の GetObject を呼び出してください。

    APIですでに使用していまして ・・・
    切り分け出来るかやってみます。

    > ところで、C# 製の DLL を VB6 から呼び出したいという
    > 最初の質問についてはどうしましょうか。
    > 私が別案のコードを紹介したせいで、スレッドのタイトルと内容が
    > 乖離してきてしまいましたね…。

    そちらの報告がまだでしたね。申し訳ありません。m(_ _)m
    どうやらx86 としてビルドしてないのがいけなかったみたいで、その他の手順を踏んでやってみると参照は出来ましたが、実行させると
    実行時エラー'438':
    オブジェクトは、このプロパティまたはメソッドをサポートしていません。
    と出てストップします。

引用返信 削除キー/
■33360 / inTopicNo.8)  Re[8]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ 魔界の仮面弁士 大御所(1024回)-(2016/05/02(Mon) 12:52:35)
  • アイコンNo33358に返信(Junさんの記事)
    >> Set c = New VirtualDesktopManager
    >> If c.IsVirtualDesktop(Me.hWnd) Then

    ごめんなさい! IsVirtualDesktop ではなく
    IsWindowOnCurrentVirtualDesktop の間違いです。`
    最初の No33343 の元コードにつられてしまいました。


    ようするに、
    > Public Function IsWindowOnCurrentVirtualDesktop(ByVal topLevelWindow As Long) As Boolean
    を呼び出せば良いということです。


    > 本体の標準モジュールで下記のように宣言しています。
    GetObjectA の Declare は不要です。
    API の GetObject 関数ではなく、
    VB6 / VBA の標準関数の GetObject を呼び出してください。



    ところで、C# 製の DLL を VB6 から呼び出したいという
    最初の質問についてはどうしましょうか。

    私が別案のコードを紹介したせいで、スレッドのタイトルと内容が
    乖離してきてしまいましたね…。
引用返信 削除キー/
■33358 / inTopicNo.9)  Re[7]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ Jun 一般人(3回)-(2016/05/01(Sun) 13:16:54)
  • アイコンNo33353に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士さん手取り足取りありがとうございます。
    返答が遅くなり申し訳ありません。

    サンプルを利用させて頂きましたが・・・

    > 試しに作ってみました。Form1 からであれば
    >  Dim c As VirtualDesktopManager
    >  Set c = New VirtualDesktopManager
    >  If c.IsVirtualDesktop(Me.hWnd) Then
    >   MsgBox "OK"
    >  End If
    > のように利用できるはずです。

    プログラム内に新しく VirtualDesktopManager というクラスモジュールを作り
    実行すると IsVirtualDesktop がないと出てきます。
    そこでもしかすると If c.IsVirtualDesktop(Me.hWnd) を If c.IsWindowOnCurrentVirtualDesktop(Me.hWnd) とするとうまくいくかなぁと思いやってみました。
    ここはすんなり通ったみたいなのですが、下記のところでエラーが出ます。

    > Call IIDFromString(StrPtr("{a5cd92ff-29be-454c-8d04-d82879fb3f1b}"), iid(0))
    > Set oVirtualDesktopManager = GetObject("new:aa509086-5ca9-4c25-8f95-589d3c07b48a")
    > Call Invoke32(ObjPtr(oVirtualDesktopManager), 0, VarPtr(iid(0)), VarPtr(pIVirtualDesktopManager))
    > End Sub

    エラーは「GetObject は引数が足りません。」です。

    本体の標準モジュールで下記のように宣言しています。

    Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, ByRef lpObject As Any) As Long

    ほんとにお手数をかけて申し訳ありません。
    もう少しおつきあいくださいませ。

引用返信 削除キー/
■33353 / inTopicNo.10)  Re[6]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ 魔界の仮面弁士 大御所(1023回)-(2016/04/30(Sat) 04:02:04)
  • アイコン
    No33349に追記(魔界の仮面弁士の記事)
    > なお、質問内容からは外れてしまいますが、もしもやりたいことが
    > {a5cd92ff-29be-454c-8d04-d82879fb3f1b} の IVirtualDesktopManager を
    > 利用するという点だけなのであれば、C# を介さずに、
    > VB6 や VBA から直接呼び出すという選択肢もあるかも。
    
    
    試しに作ってみました。Form1 からであれば
     Dim c As VirtualDesktopManager
     Set c = New VirtualDesktopManager
     If c.IsVirtualDesktop(Me.hWnd) Then
      MsgBox "OK"
     End If
    のように利用できるはずです。
    (手元に VB6 が無いので、動作検証は 32bit 版の Excel 2016 で行っています)
    
    
    '-----------------------------------------------------------
    'クラスモジュール "VirtualDesktopManager"
    Option Explicit
    
    Private oVirtualDesktopManager As IUnknown
    Private pIVirtualDesktopManager As Long
    
    Private Declare Function IIDFromString Lib "ole32" _
       (ByVal lpsz As Long, _
        ByRef lpiid As Byte) As Long
    
    Private Declare Function StringFromGUID2 Lib "ole32" _
       (ByVal rguid As Long, _
        ByVal lpstrClsId As Long, _
        ByVal cbMax As Integer) As Long
    
    Private Declare Function DispCallFunc Lib "oleaut32" _
       (ByVal pvInstance As Long, _
        ByVal oVft As Long, _
        ByVal cc As Integer, _
        ByVal vtReturn As Integer, _
        ByVal cActuals As Long, _
        ByRef prgvt As Integer, _
        ByRef prgpvarg As Long, _
        ByRef pvargResult As Variant _
    ) As Long
    
    
    Private Sub Class_Initialize()
        Dim iid(0 To 15) As Byte
        Call IIDFromString(StrPtr("{a5cd92ff-29be-454c-8d04-d82879fb3f1b}"), iid(0))
        Set oVirtualDesktopManager = GetObject("new:aa509086-5ca9-4c25-8f95-589d3c07b48a")
        Call Invoke32(ObjPtr(oVirtualDesktopManager), 0, VarPtr(iid(0)), VarPtr(pIVirtualDesktopManager))
    End Sub
    
    Private Sub Class_Terminate()
        Call Invoke32(pIVirtualDesktopManager, 2)
        pIVirtualDesktopManager = 0
        Set oVirtualDesktopManager = Nothing
    End Sub
    
    Private Function Invoke32(ByVal pInstance As Long, ByVal fIdx As Long, ParamArray args() As Variant) As Variant
        Dim l As Long, u As Long, c As Long
        l = LBound(args)
        u = UBound(args)
        c = u - l + 1
    
        Dim vp() As Long
        Dim vt() As Integer
        ReDim vp(IIf(c = 0, l, u))
        ReDim vt(IIf(c = 0, l, u))
    
        Dim i As Long
        For i = l To u
            vt(i) = VarType(args(i))
            vp(i) = VarPtr(args(i))
        Next
    
        Dim hr As Long
        hr = DispCallFunc(pInstance, fIdx * 4, 4, vbLong, c, vt(l), vp(l), Invoke32)
        If hr <> 0 Then
            Err.Raise hr
        End If
    End Function
    
    Public Function IsWindowOnCurrentVirtualDesktop(ByVal topLevelWindow As Long) As Boolean
        Dim outBool As Long
        Dim hr As Long
        hr = CLng(Invoke32(pIVirtualDesktopManager, 3, (topLevelWindow), outBool))
        If hr = 0 Then
            IsWindowOnCurrentVirtualDesktop = CBool(outBool)
        Else
            Err.Raise hr
        End If
    End Function
    
    Public Function GetWindowDesktopId(ByVal topLevelWindow As Long) As String
        Dim hr As Long
        Dim iid() As Byte
        ReDim iid(0 To 15)
        hr = CLng(Invoke32(pIVirtualDesktopManager, 4, (topLevelWindow), iid(0)))
        If hr = 0 Then
            Dim bIID() As Byte
            bIID = String$(40, 0)
            Call StringFromGUID2(VarPtr(iid(0)), VarPtr(bIID(0)), 40)
            GetWindowDesktopId = Left$(UCase(bIID), 38)
        Else
            Err.Raise hr
        End If
    End Function
    
    Public Sub MoveWindowToDesktop(ByVal topLevelWindow As Long, ByVal desktopId As String)
        Dim iid(0 To 15) As Byte
        Call IIDFromString(StrPtr(desktopId), iid(0))
        Dim hr As Long
        hr = CLng(Invoke32(pIVirtualDesktopManager, 5, (topLevelWindow), iid(0)))
        If hr <> 0 Then
            Err.Raise hr
        End If
    End Sub

引用返信 削除キー/
■33349 / inTopicNo.11)  Re[5]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ 魔界の仮面弁士 大御所(1019回)-(2016/04/29(Fri) 20:03:39)
  • アイコン2016/04/30(Sat) 04:03:41 編集(投稿者)

    No33347に返信(Junさんの記事)
    >> http://qiita.com/tomochan154/items/1ce33f2aef167c0fed9d

    ちなみにこのサイトの説明だと、プラットフォーム ターゲットが AnyCPU のままに
    なっています。 VB6 は 32bit アプリですので、x86 としてビルドした方が良いでしょう。


    > 参考にしながらやってみましたが利用できないですね。

    今の状況では、記載したコードが間違っているのか、手順に漏れがあるのか、
    それとも環境依存の障害が発生しているのかを判断できないので、
    修正箇所を提示することができません。

    まずは実際に行った手順を、一つ一つ掲示板に書き出してみて頂けますか?

    それと、実際に試してみた結果、『どうなってしまったのか』という情報も、
    状況確認のために重要な情報となりますので、併せて記述していただけると助かります。


    たとえば VB6 が「指定したファイルの参照は登録できません」と報告するなら
    C# 側で ComVisible 属性を指定し忘れている可能性がありますし、あるいは
    「ファイルまたはアセンブリ名、またはその依存関係の1つが見つかりませんでした」
    であれば、ファイルの置き場所が悪いか依存ファイルが不足している状態、
    「システム レジストリへのアクセスでエラーが発生しました」であれば、
    開発環境を管理者権限で実行してから試してみるのが良いでしょう。


    以下、参考までに。

    2003/10/06【 .NETコンポーネントをVB6から使用するための方法 】
    http://www.ijupiter.co.jp/world/dc_interrop/dotnet_com_interrop.html

    2007/12/03【 Visual Basic 6.0 から Visual Basic .NET または Visual Basic 2005 アセンブリを呼び出す方法 】
    https://support.microsoft.com/ja-jp/kb/817248

    2016/02/22【 No33255 Re[3]: C# 製COMをJavaScriptから使う時のイベントフック 】
    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=33246&no=0#7

    2015/03/20【 No75398 VB.netからVC++6.0のへの構造体配列参照渡し 】
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=75306&page=20&KLOG=127#8


    なお、質問内容からは外れてしまいますが、もしもやりたいことが
    {a5cd92ff-29be-454c-8d04-d82879fb3f1b} の IVirtualDesktopManager を
    利用するという点だけなのであれば、C# を介さずに、
    VB6 や VBA から直接呼び出すという選択肢もあるかも。
引用返信 削除キー/
■33347 / inTopicNo.12)  Re[4]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ Jun 一般人(2回)-(2016/04/28(Thu) 14:04:07)
http://Windows10
  • アイコンNo33346に返信(TAさんの記事)
    >>VB6.0からこれを参照設定しようとしたのですが拒否されました。
    >
    > 参照設定を可能にするには相応の手順が必要かもしれません。
    > http://qiita.com/tomochan154/items/1ce33f2aef167c0fed9d
    > ここで説明している内容が参考になりませんか?
    > (未確認ですが…。)

    TA様 レスありがとうございます。
    参考にしながらやってみましたが利用できないですね。
    100%理解してやったわけではないので自分に問題があるのかもしれません…
引用返信 削除キー/
■33346 / inTopicNo.13)  Re[3]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ TA 一般人(1回)-(2016/04/28(Thu) 13:33:43)
  • アイコン> VB6.0からこれを参照設定しようとしたのですが拒否されました。

    参照設定を可能にするには相応の手順が必要かもしれません。
    http://qiita.com/tomochan154/items/1ce33f2aef167c0fed9d
    ここで説明している内容が参考になりませんか?
    (未確認ですが…。)
引用返信 削除キー/
■33345 / inTopicNo.14)  Re[2]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ Jun 一般人(1回)-(2016/04/28(Thu) 13:16:25)
http://Windows10
  • アイコンNo33344に返信(魔界の仮面弁士さんの記事)
    > ■No33343に返信(junさんの記事)
    >>DLLを作成したのですがうまく作動しなくて困っています。
    >
    > C# で作れるのは、参照設定して使うタイプの DLL です。
    > Declare で呼び出すタイプの DLL は、C# では作れません。

    魔界の仮面弁士様
    早速のレスありがとうございます。

    VB6.0からこれを参照設定しようとしたのですが拒否されました。

    VBでタスクビュー(VirtualDesktop)にアプローチする手段が
    今のところなさそうなのでお手上げですね。
    残念です^^;
引用返信 削除キー/
■33344 / inTopicNo.15)  Re[1]: C#で作成したDLLがVB6.0で利用できない
□投稿者/ 魔界の仮面弁士 大御所(1018回)-(2016/04/28(Thu) 12:06:45)
  • アイコンNo33343に返信(junさんの記事)
    > DLLを作成したのですがうまく作動しなくて困っています。

    C# で作れるのは、参照設定して使うタイプの DLL です。
    Declare で呼び出すタイプの DLL は、C# では作れません。
引用返信 削除キー/
■33343 / inTopicNo.16)  C#で作成したDLLがVB6.0で利用できない
□投稿者/ jun 一般人(3回)-(2016/04/28(Thu) 11:55:53)
  • アイコン環境/言語:[Windows10] 
    分類:[.NET] 

    Windows10のタスクビュー切り替え時に利用するため、アクティブな仮想デスクトップ上に
    いるか確認するDLLを作成したのですがうまく作動しなくて困っています。

    C#のソースです
    '-------------------------------------------------------------
    ClassLibrary1
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using WindowsDesktop;

    namespace ClassLibrary1
    {
    public class Class1
    {
    public static Boolean IsVirtualDesktop(IntPtr Handle)
    {
    return (VirtualDesktopManager.DesktopManager.IsWindowOnCurrentVirtualDesktop(Handle));
    }
    }
    }
    '-------------------------------------------------------------
    using System;
    using System.Runtime.InteropServices;

    public class VirtualDesktopManager
    {
    public static readonly IVirtualDesktopManager DesktopManager;

    static VirtualDesktopManager()
    {
    var type = Type.GetTypeFromCLSID(new Guid("aa509086-5ca9-4c25-8f95-589d3c07b48a"));
    DesktopManager = (IVirtualDesktopManager)Activator.CreateInstance(type);
    }
    }
    '-------------------------------------------------------------
    VirtualDesktopManager.cs

    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("a5cd92ff-29be-454c-8d04-d82879fb3f1b")]
    public interface IVirtualDesktopManager
    {
    bool IsWindowOnCurrentVirtualDesktop(IntPtr topLevelWindow);
    Guid GetWindowDesktopId(IntPtr topLevelWindow);
    void MoveWindowToDesktop(IntPtr topLevelWindow, ref Guid desktopId);
    }
    '-------------------------------------------------------------

    上記プロジェクトでDLLを作成しました。

    VB6.0にて呼び出し側のプラットフォームを下記の通り作成し実行したところ

    標準モジュール
    Declare Function IsVirtualDesktop Lib "ClassLibrary1" (ByVal HWND As Long) As Boolean

    Form1

    If IsVirtualDesktop(Me.HWND) Then
    MsgBox "OK"
    End If

    実行時エラー'453'
    エントリIsVirtualDesktopがDLLファイルClassLibrary1内に見つかりません。

    と出てしまいます。

    うまく動作させたいのですが御教授ください。

引用返信 削除キー/



トピック内ページ移動 / << 0 >>
Mode/  Pass/


- Child Tree -