Google
 
Web itpro-blogger.blogspot.com
金曜日, 5月 04, 2007

[VC++]ping

▼質問
ビルドしたら下記のエラーが出た。
「error LNK2019: 未解決の外部シンボル _IcmpSendEcho@32 が関数 "unsigned long __cdecl 関数名(unsigned long,int)" (mailto:YAKKH@Z) で参照されました。 オブジェクト名.obj

▼回答
IcmpSendEcho関係をリンクするライブラリがないと思われる。
下記のサイトでIP Helper APIを使うためには、Platform SDKをインストールと書いてあった。

IPHLPAPIを使ってWindowsでネットワーク設定いじるプログラムを書く
http://www.geekpage.jp/programming/iphlpapi/

Windows Platform SDKのインストール方法もこのサイトに説明されていた。感謝!感謝!

Windows Platform SDKのインストール
http://www.geekpage.jp/programming/platform-sdk/

VC++2005なのでこっちの説明の方が良さそうである。

Visual C++ Express Editionを使ってみる(Windows Platform SDK編)
http://freepg.fc2web.com/cpp/topic_vce_001.html

「IPHlpApi.Lib」をリンクした解決した。

■参考サイト
IPHLPAPI(IP Helper API)の使い方 [自作ping]
http://www.geekpage.jp/programming/iphlpapi/send-icmp.php

▼質問
ビルドしたら下記のエラーが出た。
「error LNK2019: 未解決の外部シンボル _inet_addr@4 が関数 "unsigned long __cdecl 関数名(char *,int)" (?関数名@@YAKPADH@Z) で参照されました。 オブジェクト名.obj 」

▼回答
IPアドレスをLong型の数値に変換するinet_addr関数を使用すると「Ws2_32.lib」をリンクしないと
いけないようだ。


木曜日, 5月 03, 2007

[VC++]文字列

▼質問
wchar_t型からchar型に変換するにはどうしたらいいの?

▼回答

TCHAR * str1 = TEXT("テスト");
TCHAR str2[32];
lstrcpy(str2 , str1);


■参考サイト
方法 : さまざまな文字列型間で変換する
http://msdn2.microsoft.com/ja-jp/library/ms235631(VS.80).aspx


水曜日, 5月 02, 2007

[VC++]oo4o接続・設定

▼質問
リビルドすると下記のエラーが発生する。
「fatal error C1083: include ファイルを開けません。'oracl.h': No such file or directory ファイルパス 行番号」

▼回答
オラクルがインストールされた下記のパスのどちらかを「構成プロパティ」→「C/C++」→「全般」→
「追加のインクルード ディレクトリ」に追加する。
クライアントインストール:\oracle\product\10.2.0\client_1\oo4o\CPP\INCLUDE
オラクルインストール:\oracle\product\10.2.0\db_1\oo4o\CPP\INCLUDE

▼質問
リビルドで下記のエラーが出る。
「error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: int __thiscall ODynaset::Close(void)" (__imp_?Close@ODynaset@@QAEHXZ) が関数 __catch$_ファイル名@4$0 で参照されました。 オブジェクトファイル名」

▼回答
オラクルがインストールされた下記のパスのどちらかを「構成プロパティ」→「リンカ」→「入力」→
「追加の依存ファイル」に追加する。
クライアントインストール:\oracle\product\10.2.0\client_1\oo4o\CPP\LIB\ORACLM32.LIB
オラクルインストール:\oracle\product\10.2.0\db_1\oo4o\CPP\LIB\ORACLM32.LIB


[C言語orC++]VC++2005へのバージョンアップ

▼質問
C言語で書かれたソースをVC++2005でリビルドすると下記のエラーが出る。
「警告 1 warning C4996: 'strcpy' が古い形式として宣言されました。 ファイルパス 行番号」

▼回答
VC++2005のランタイムから既存標準関数のセキュリティが持つ脆弱性の対応で
新しい関数が提供されたため。

回避策として次のコードを記述すると無効にできる。
#pragma warning(disable : 4996)

他の回避方法として次の#defineのどちらかを定義すればと書いてあったので
試してみたが警告は消えなかった。なぜ?

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_NO_DEPRECATE 1

理由はわからないがヘッダファイルの「stdafx.h」に記述したら消えたぞ!
記述の場所は、ヘッダーファイルが記述している前にしないといけないみたい。

「_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES」の定義は消えない
警告もあるので「_CRT_SECURE_NO_DEPRECATE」を使った方が良いみたい。(^^)v

プロジェクトのプロパティでも定義できるようなのでそちらも試してみました。

「構成プロパティ」->「C/C++」->「プリプロセッサ」->「プリプロセッサの定義」の
末尾に 追加する。

この他にも下記の関数も変更になったようだ。

従来の関数:セキュアな関数
strcpy:strcpy_s
strncpy:strncpy_s
printf:printf_s
asctime:asctime_s
ctime:ctime_s

■参考サイト
Visual C++ 2005 C/C++ランタイム ライブラリ新機能概要
http://www.microsoft.com/japan/msdn/security/demo/runtime.aspx
CRT のセキュリティ強化
http://msdn2.microsoft.com/ja-jp/library/8ef0s5kh(VS.80).aspx


;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T

▼質問
ライブラリのリンクってどうやってやるの?

▼回答
こんな方法があるよ。

プロジェクトのプロパティでライブラリのファイルを絶対パス(フルパス)で直接設定する方法と
ライブラリファイルとパスを分けて設定する方法があるよ。

前者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」に「絶対パス(フルパス)」
を指定する。

後者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」にリンクするライブラリ
ファイルを指定して、そのライブラリまでのパスを下記のプロパティに設定する。
「構成プロパティ」->「リンカ」->「全般」->「追加のライブラリ ディレクトリ」


This page is powered by Blogger. Isn't yours?