tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルPInvokeStackImbalance が検出されました。VB2005
記事No6648
投稿日: 2007/12/10(Mon) 17:12
投稿者しんかい
お世話になります。
VB6→VB2005にアップグレードしました。なんとかエラーは無くなりました。
しかし2ヶ所に※PInvokeStackImbalance が検出されました。

メッセージ
PInvoke 関数 '・・Net.Form1:GetWindowLong' がスタックを不安定にしています。
PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが
原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータが
ターゲットのアンマネージ シグネチャに一致していることを確認してください。

           '****ウィンドウ属性を取得****
nIndex = GetWindowLong(Me.Handle.ToInt32, GWL_EXSTYLE)  '※
               ' ****半透明を設定****
Call SetWindowLong(Me.Handle.ToInt32, GWL_EXSTYLE, nIndex Or WS_EX_LAYERED)  '※

エラーが無いのにメッセージが表示されましたが良く意味が判りません。
アドバイスをして頂けますと幸いです。宜しくお願い致します。

[ツリー表示へ]
タイトルRe: PInvokeStackImbalance が検出されました。VB2005
記事No6649
投稿日: 2007/12/10(Mon) 17:40
投稿者Hongliang
コンパイルエラーがなくなれば全てのバグがなくなるってわけじゃありませんし。

さて、それはメッセージ通り Declare 宣言で型のサイズが変なときなどに出るものです。
それら2関数の宣言を確認してください。
あ、その前にヘルプで「アンマネージ コードとの相互運用」という項目を探して、そこから下のページを読破してください。修正箇所がつかめるようになります。

視点を変えて、API の使用の代わりに .NET のライブラリで代用できるかどうか調べてみても良いかもしれません。

[ツリー表示へ]
タイトルRe: PInvokeStackImbalance が検出されました。VB2005
記事No6650
投稿日: 2007/12/10(Mon) 17:47
投稿者魔界の仮面弁士
>                ' ****半透明を設定****
> Call SetWindowLong(Me.Handle.ToInt32, GWL_EXSTYLE, nIndex Or WS_EX_LAYERED)  '※

WS_EX_LAYERED …というと、レイヤード ウィンドウですか?
http://www.microsoft.com/japan/msdn/windows/windows2000/layerwin.aspx

そもそも透明にするだけなら、API を使用する必要は無く、
フォームのプロパティを指定するだけで済みますよ。.NET では。

(1) フォームを半透明にさせる場合……Opacity に透明度を百分率にて指定
(2) 指定色のみ完全透過させる場合……TransparencyKey に特定の色を指定


> PInvoke 関数 '・・Net.Form1:GetWindowLong' がスタックを不安定にしています。
Declare 宣言が間違っている可能性があるかと。

[ツリー表示へ]
タイトルRe^2: PInvokeStackImbalance が検出されました。VB2005
記事No6651
投稿日: 2007/12/10(Mon) 19:06
投稿者しんかい
Hongliang 様

返答をしてもらいましてお礼を申し上げます。

>コンパイルエラーがなくなれば全てのバグがなくなるってわけじゃありませんし。
はいそうですか。。VB6の感じでいましたので
>Declare 宣言で型のサイズが変なときなどに出るものです。
そうですかDeclare ですか。絞る事ができました。
>その前にヘルプで「アンマネージ コードとの相互運用」という項目を探して、
>そこから下のページを読破してください。修正箇所がつかめるようになります。
「アンマネージ コードとの相互運用」を見てみましたが今の段階では難しいです。
今後は習慣をつけていきたいと思います。
>API の使用の代わりに .NET のライブラリで代用できるかどうか調べてみても良いかもしれません。
はい、判りました。
貴重な情報を提供してもらいましてありがとうございました。

参考  'ウィンドウ属性関連API
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
  (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA"
   (ByVal hWnd As Long, ByVal nIndex As Long) As Long

[ツリー表示へ]
タイトルRe^3: PInvokeStackImbalance が検出されました。VB2005
記事No6652
投稿日: 2007/12/10(Mon) 19:08
投稿者しんかい
魔界の仮面弁士 様

返答をしてもらいましてお礼を申し上げます。

>WS_EX_LAYERED …というと、レイヤード ウィンドウですか?
はい、そうです。本ウィンドウの半透明化→透明をVB6→VB2005にアップデートしました。
>フォームのプロパティを指定するだけで済みますよ。.NET では。
>http://www.microsoft.com/japan/msdn/windows/windows2000/layerwin.aspx
そうですかVB2005ではAPI を使用しないで代用できるのですね。判りました。
>Declare 宣言が間違っている可能性があるかと。
Declareによる宣言を色々探してみてコンパイルしてみたいと思います。
貴重なアドバイス情報を提供してもらいましてありがとうございました。

[ツリー表示へ]
タイトルRe^4: PInvokeStackImbalance が検出されました。VB2005
記事No6654
投稿日: 2007/12/10(Mon) 20:38
投稿者しんかい
お陰様で解決できました。
Declareで色々試してみましたが解決する事ができませんでした。
ご指導してもらいました1行で解決できました。

        'フォームの不透明度を変更する
        Me.Opacity = 0.1 * (10 - newScrollValue)

Hongliang様、魔界の仮面弁士様、ありがとうございました。

[ツリー表示へ]
タイトルRe^5: PInvokeStackImbalance が検出されました。VB2005
記事No6663
投稿日: 2007/12/11(Tue) 17:58
投稿者よねKEN
目的は達成できたようでよかったですね。

> Declareで色々試してみましたが解決する事ができませんでした。

それはそうと元々の問題点は、「参考  'ウィンドウ属性関連API」
で挙げられている例について言えば、
VB6のLong型は32ビット、VB.NETのLong型は64ビットという違いによるものです。
多くの場合はVB6でLong型だったものはVB.NETでIntegerにすることで対応できます。

Windows APIを正確に使うには、Hongliangさんが指摘されている
「アンマネージ コードとの相互運用」といった辺りのリファレンスを
熟読しておく必要があるでしょうけれど。

[ツリー表示へ]
タイトルRe^6: PInvokeStackImbalance が検出されました。VB2005
記事No6667
投稿日: 2007/12/11(Tue) 20:15
投稿者しんかい
よねKEN  様

返答をしてもらいましてお礼を申し上げます。
>目的は達成できたようでよかったですね。
ありがとうございます。
>VB6のLong型は32ビット、VB.NETのLong型は64ビットという違いによるものです。
>多くの場合はVB6でLong型だったものはVB.NETでIntegerにすることで対応できます。
ああ、そうゆうことですか。たいへん勉強になりました。
>Windows APIを正確に使うには、Hongliangさんが指摘されている
>「アンマネージ コードとの相互運用」といった辺りのリファレンスを
>熟読しておく必要があるでしょうけれど。
VB2005はまだ不慣れですが「アンマネージ コードとの相互運用」は調べる為には必要な
情報を提供してもらいまして感謝しております。最初VB2005は難しく思っていましたが
使いなれてきますと簡単な記述で済むことも自分なりに感じました。

[ツリー表示へ]