- - PR -
WINSOCKライブラリをVS2005C++(CE用)で使用するとエラー?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-03-08 17:32
はじめまして。。。
VS2005のC++で元々VS6.0で作成されたプログラムを移植しています。 CE用に提供されたWinsockLIBを静的リンクしました。 すると、ソケットを作成し、サーバーへ接続する処理で未解決シンボルエラーとなり DLLの作成ができません。 __GSHandlerCheck __security_cookie __security_check_cookie _DllMainCRTStartup 以上4つの参照が解決できません。 特に上記関数は呼んでいないのですが、SOCKET関連の関数から呼ばれているのでしょうか? VC6ではこのエラーは出ていませんでした。 .NET関連でセキュリティ強化?でもされたのでしょうか? 何か設定、または、解決策等ご教授願います。 開発環境:VS2005 C++(Win32スマートデバイスプロジェクトでMFC未使用のDLLです。) ターゲットOS:WinCE.NET5.0(ARMV4I)です。 | ||||
|
投稿日時: 2007-03-12 16:26
自己レスです。と言っても解決はしていません
いろいろ調べたのでですが、現象の解決策がわかっておりません。 ただ、このプロジェクトの作成の時、W32スマートデバイスプロジェクトでDLLを作成しましたが、そもそもWinsockの静的リンクはできるのでしょうか? 別途MFCのDLLのテンプレートを使用すると「Winsockサポートする」の指定がウィザードでできるのです。と言うことは、.NET?ではAPIの様にWinsockAPIを呼び出すことはできないのでしょうか?(MFCやCFを使えば呼び出せる?) だんだん.NETとは関連が無い質問になってしまいましたが、よろしくお願いいたします。 | ||||
|
投稿日時: 2007-03-12 17:14
こんにちは。
環境が無いので確認はとれてませんが、 "GSHandlerCheck"あたりで検索したら、下記のような記事が見つかりました。 http://blogs.msdn.com/mgaur/archive/2006/12/21/lnk2019-unresolved-external-symbol-gshandlercheck.aspx#1848355 明示的に「libcmt.lib」をリンクすれば、リンクエラーが回避できる…と書いてあるようですが!? | ||||
|
投稿日時: 2007-03-12 18:31
Tdnr_Symさん。ご回答感謝します。
確かにlibcmt.libをリンク〜となってましたので、リンクしてみました。 ・・・というか、リンクしようとして、どの様にリンクするんだっけ?とプロジェクトをいじくっていたのですが、「GSHandlerCheck」のエラーがいつの間にか無くなっていました???思い当たる変更箇所を戻したのですが、「GSHandlerCheck」のエラーだけは出なくなってしまいました。 libcmt.libの静的リンクの指定「#pragma comment(lib, "libcmt.lib")」をはずしてもエラーはでません。一度プロジェクトの設定でリンカ→入力→依存の追加でlibcmt.libを追加したんですが、この指定も取ったのですが??? 全くもって、初心者の様な有様で恥ずかしいです。。。 良いか悪いか、とりあえず「GSHandlerCheck」はでなくなりました。 →ただ自分でも納得できていません。。。 __security_cookie __security_check_cookie _DllMainCRTStartup のエラーはまだ未解決です。 security_cookieは「MSVCRT.LIB」をリンクすればよさそう・・・の記述があったのですが、静的リンクしても解決できませんでした。 また何かありましたらよろしくお願いいたします。 | ||||
|
投稿日時: 2007-03-12 23:46
_DllMainCRTStartupはDLLのインスタンスルーチンです。たぶんプロジェクトの作り方を間違えていて、DLLのインスタンスルーチンがそのまま組み込まれているのでしょう。ソースコードを見直してください。 __security_cookieのほうはわからないです。 | ||||
|
投稿日時: 2007-03-13 09:23
甕星さん。ご回答ありがとうございます。
DllMainCRTStartupについてですが、インスタンスルーチンがそのまま組み込まれているとの事ですが、プロジェクト内を検索しましたが、見当たりませんでした。 Win32アプリケーションでいうところのWinMainの事でしょうか? または、DLLのDllMainの事でしょうか? Win32DLL(スマートデバイスアプリケーションのDLL)でウィザードを使用して DLLを作成したので、自作API以外では作成していません。 何か設定等があるのでしょうか? それと、security_cookieの方ですが、自己レスです。 プロジェクトの設定で、バッファセキュリティのチェックという項目があり、 その設定を「いいえ」(/GS-オプション)にするとエラーが出なくなりました。 バッファオーバーランのチェックをするオプションの様でデフォルトでは「はい」となっていました。 ただ、このオプションを「いいえ」にすることでどうなるかが不明なのと、 この「バッファオーバーランのチェック」とは無くても問題無いのかが、 いまいち分かりません。 良くSPの更新などでバッファオーバーラン云々と聞きますが、ソケット通信を 行う場合、このバッファオーバーランのチェックは必要なのでしょうか? |
1