none
「プロシージャ エントリ ポイント が見つからない」という現象について RRS feed

  • 質問

  •  開発中のプログラムにおいて、次のメッセージが表示されて全く起動しないように
    なりました。

      「プロシージャ エントリ ポイント GetThreadId が
     ダイナミック リンク ライブラリ kernel32.dll から見つかりません。」

     このようなエラーは、通常リンクに使用するインポート・ライブラリと
    実際に動作するDLLのバージョンが異なっている場合に発生することがあると
    理解していますが、今回の現象はどうもそれとは違う現象のようです。

      ☆ 件の GetThreadId は Kernel APIの一つであり、めったに変更される
       ものではない。 インポート・ライブラリのバージョン違いが原因とは
       思われない。

      ☆ ある時点までGetThreadIdを使用していても、問題現象は全く発生して
       いなかった。

     上記以外で、ほかにどのような場合に起こり得るのでしょうか ?
    また、対処方等ありましたら、ご助言いただきたく思います。

     ちなみにソース改修の直前までは、上記エラーは発生していませんでした。
    上記エラーは Windows XP SP3 で発生していますが、同じソース・コードで
    Windows 7 では発生しません。

     なお、気になる点として、次のことが上げられます。
    この現象が発生する直前に、次のような誤った処理を行ってしまいました。

      ☆ 1つのスレッドを除いて、ある特定のプロセスの全スレッドを
       休止させたかったが、ThreadFirst、ThreadNextで列挙される
       無関係のプロセスのスレッドを誤っていくつも休止してしまった。

        ※ CreateToolhelp32SnapshotでプロセスIDを指定するので、
         該当プロセスのスレッドのみが列挙されると思っていたが、
         該当プロセス以外のものまで列挙された。

      ☆ 無関係のスレッドの再開等復旧処理ができず、またシャットダウンも
       できなかったので、電源ボタン長押しで電源断を行った。

     問題が発生している環境は、次の通りです。

      ・ Windows XP SP3
      ・ Visual Studio 2008 SP1
      ・ Windows SDK v6.0A

    以上、よろしくお願いいたします。


    Y. Peabrain
    2010年4月18日 12:02

回答

すべての返信

  • GetThreadIdのドキュメント は読まれたのでしょうか?
    Windows Server 2003およびWindows Vista以降で提供されているAPIです。
    Windows XPで動作したというのは気のせいかと思います。

    • 回答としてマーク ななち 2010年4月18日 16:15
    2010年4月18日 12:50
  • 回答ありがとうございます。

    確かにXPで動いたという記憶は、不確かでした。
    GetThreadID APIの対応バージョンまでは、気をつけていませんでした。
    他プロセス制御とXP・Win7のマルチ・ブート環境では、思いがけないことが度々起こり、
    かなりあせってしまいました。 また、OSの入れ換えになるのかと・・・

    問題のスレッドは、CreateThreadではなく、CreateRemoteThreadで生成したものです。
    でこれも、調べもせずスレッドIDが返ってこないものと思いこんでしまいました。
    よく見てみたら、このスレッド生成でも、スレッドIDが返ってきますね。
    これを使うことにします。


    Y. Peabrain
    2010年4月18日 14:16