出産前後の痔にはご注意!

WinXP
VC++6アプリで中国語を表示したいのですがうまくいきません。

<現象>
リソースファイル*.rc
string tableのプロパティで言語を中国語P.R.Cにして、
簡体字中国語を入力しても「?」に変換されて入力できません。

何が悪いのでしょうか?お教えください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

Unicodeアプリにしてみるのはどうでしょうか?


従来のMBCSアプリとUnicodeアプリの両方ビルドできるように、プロジェクトを設定できます。

#define _UNICODE
#define UNICODE
#pragma comment(linker, "/entry:\"wWinMainCRTStartup\"")

参考URL:http://hp.vector.co.jp/authors/VA000092/win32/un …
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはりIDE自体が日本語入力のみなので、IDEで直接入力は無理です。
shirayukixさんの方法で
もう少し調べてみます。

お礼日時:2007/08/08 18:59

プログラム中でSetThreadLocaleで明示的に中国語のロケールを指定するか、実行するマシンのコンパネの地域と言語のオプショ

ンでUnicode対応でないプログラムの言語設定を「中国語」に指定するとかしてみたらどうでしょう?
    • good
    • 0

中国語IMEからの入力を中国語文字列としてみてないのでしょうかねえ


編集時の表示フォントが、日本語の文字しかもっていないもの
ということはないですよね?

わたしがあるソフトのメッセージの中国語化をやったのは
大昔なんで、断片的にしか状況を思い出せません。

ただ、VC++のIDEからメッセージ文字列の編集は
しなかったような気がするんですけどねえ。
どうだったかな。
    • good
    • 0

rcファイルへの入力はどのように行っているのでしょうか?



日本語版の環境でそのまま(日本語の)IMEを使ってですか?

この回答への補足

WinXPなので、
コンパネから中国語入力を追加し、
Chinese(Simplified) -Microsoft Pinyin IME 3.0
にて入力しています。

補足日時:2007/08/06 18:38
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QWindows標準の中国語(繁体字)のゴシックフォントはありますか?

Windows標準で、
簡体字(明朝系)→ SimSun
簡体字(ゴシック系)→ SimHei
繁体字(明朝系) → MingLiu
はありますが、
繁体字(ゴシック系)フォントが見当たらないのですが、もし知っている方がいらっしゃったらお教えください。
中国語(繁体字)Windowsでは普通なんというゴシックフォントを使っているのでしょうか?自由に使える適当なゴシックフォントがなくて困っています。
よろしくお願いいたします。

Aベストアンサー

なんだかあちこちで回答しているような,いろんな携帯で同じ人と会話しているような,変な感じですね。

それはともかく,一部の漢字が使えないのは,CJK で無理に統一したせいかもしれません。具体的に何という字でしょうか?

それから,「。」や「,」ですが,台湾式に真ん中に丸や点を打ちたいと言うことでしょうか? それならば,たとえば Word であれば,[挿入]-[記号と特殊文字] で,フォントに SimHei を選択,種類で「CJK用の記号および分音記号」を選択すれば,あります。

QUNICODE文字が書き込めるWriteprivateProfileStringのようなファイルに書き込む関数はないですか?

お世話になります。

VC++ MFC VisaualStidio 2003 で開発しております。

UNICODE文字が書き込めるWriteprivateProfileStringのようなファイルに書き込む関数はないでしょうか?

ファイルを使用して、他EXEとやり取りしているのですが、WriteprivateProfileStringは、ANSI文字にもある文字しか使用できないみたいです。

「森?外

Aベストアンサー

WritePrivateProfileStringの問題というより、iniファイルがそもそもUNICODEに対応していないということなんでしょうね。

iniファイルはユーザーからも見られるような設定ファイルを作るためには非常に便利ですが、EXE同士のやりとりだけなら、別にiniファイルでなくてもかまわないと思います。バイナリファイルで十分でしょう。

もし、ユーザーからも参照しやすい形式でやりとりしたいのであれば、XMLを使うのはどうでしょうか?MSXMLを使えば、簡単に読み書きができますよ。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QCStringからchar*への型変換について教えてください。

以前の質問に

int型 → CString型/char型

がありましたが、

CString型をchar*型に変換する方法を
教えていただければありがたいです。

MSDNで「LPCTSTRキャスト」が説明されていましたが、
例が載ってないのでよくわかりませんでした。

よろしくお願いします。

Aベストアンサー

目的にもよりますが一時的にchar配列として使いたいならCString::GetBuffer()が利用できます。
char配列としての利用が終わったらCString::ReleaseBuffer()する必要がありますが。

直接CString内の文字列を扱う必要があるならCString::operator LPCTSTRで文字列ポインタが得られます。
ただし、CStringオブジェクトをいじると無効ポインタなる可能性があるので気をつけてください。

MSDNのMicrosoft Foundation Classリファレンス→CString→クラスメンバで確認してください。

Qボタンの表示の色、フォントを変更したい

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。
VCを始めたばかりで、クラスの理解がまだ浅いです。。。
関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。
「○○ は ×× のメンバではありません」と、よく怒られてます。。。

識者の方、ご教授願います。
コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。

また、質問ではないのですが、「この関数は○○をする」というのではなく、
「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、
Webなどがありましたら教えてください。
今後の勉強に役立てたいと思っています。

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べ...続きを読む

Aベストアンサー

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使っています;;

一番上はBitmapを貼り付けるか、CWndのメンバ関数を使って
塗りつぶすかどうかだと思います。

MFCではなく、C++Builderのページなのですが、少しいじればMFCでも使えるので、参考URLに示しておきます。

参考URL:http://market.agr.tottori-u.ac.jp/ken/tech.html

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使って...続きを読む

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

Qサスペンド(休止やスタンバイ)のイベントを得る方法

WinXPとVB.NETで休止やスタンバイのイベントを受け取るにはどうしたらよいでしょうか?

休止(スタンバイ)に移行しても良いですか?
のメッセージを出るようにしたいのですが、
良い方法があったら教えてください。

Aベストアンサー

>WinXPとVB.NETで休止やスタンバイのイベントを受け取るには?
WndProc (WindowsProcとも言われたりします)
を利用します。

ただ、これはシステムフックをする事になるので、ここでは
1・重い負荷を与える処理
2・ユーザからの入力を待機する処理
はご法度です!!


もしそのような処理を入れた場合、
1・システムが次の処理を走らすことができず、動作が不安定になる
2・システムが次の処理を走らすために、アプリ側で捕まえられた処理をタイムアウトとして扱い、アプリ側の変更を受け付けなくなる
という事がありえます。


これを回避するには処理を分割しましょう。↓にまとめます。

1.休止orサスペンド要求イベントを認識する
2.休止orサスペンド要求イベントの継続を破棄する
3.ユーザに休止orサスペンドがあったことを通知する
4.ユーザに休止orサスペンドを行うかを問い合わせをする
5.ユーザへの問い合わせ結果によって、処理を行う

参考[休止状態/サスペンドの破棄]を応用
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/PowerMode/

参考[休止状態/サスペンドの実行]を応用
http://www.vbvbvb.com/jp/gtips/0301/gSetSystemPowerState.html

そこで問題となるのが、休止orサスペンドのどちらの要求が送られてきているのかがわからないということです。こればかりは仕方がありません。
なので、どのような処理にするかはユーザに任せてしまうか、サスペンド限定するなどの対応が必要になります。

電源イベント通知を即座に行わず、後で通知する方法は、私の場合であれば、タイマを利用する方法しか思いつきませんが、もっとよい方法があるかも知れません。



以下が、サンプルです。
WindowsApplication1.vbproj
├Form1.vb(コントロールは、何も置かないでいいです)
└Class1.vb




※Form1.vb
--------------------------------------------------------------------------------
Public Class Form1
  Inherits System.Windows.Forms.Form

  Private WithEvents m_obj休止 As New 休止監視()
  Private m_objListデバッグ用 As New ListBox()

#Region " Windows フォーム デザイナで生成されたコード "
~~~ここは略します~~~
#End Region

  'イベント/フォーム/ロード
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'デバッグ用のリストボックスの初期設定
    Me.Controls.Add(m_objListデバッグ用)
    m_objListデバッグ用.Size = Me.ClientSize
  End Sub

  'イベント/休止オブジェクト/発生処理
  Private Sub obj休止_発生処理(ByVal モード As 休止監視.処理モード) Handles m_obj休止.発生処理
    '発生したイベント内容をデバッグ用リストボックスに追加
    Dim l_strワーク As String = IIf(モード = 休止監視.処理モード.再開, "再開", "休止")

    m_objListデバッグ用.Items.Add(System.DateTime.Now.ToString & " " & l_strワーク)
    m_objListデバッグ用.SelectedIndex = m_objListデバッグ用.Items.Count - 1
  End Sub

  'イベント/休止オブジェクト/発生通知
  Private Sub obj休止_発生通知(ByRef モード As 休止監視.休止モード) Handles m_obj休止.発生通知
    'サスペンドor休止状態が起ころうとしたことを通知
    'さらに、遂行する処理を返却する
    Dim l_msgRet As Microsoft.VisualBasic.MsgBoxResult
    Dim l_strMsg As String = ""

    l_strMsg &= "は い: サスペンド" & vbCrLf
    l_strMsg &= "いいえ: 休止状態" & vbCrLf
    l_strMsg &= "CANCEL: 何もしない" & vbCrLf

    l_msgRet = MsgBox(l_strMsg, MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Question, "休止モード継続お知らせ")
    Select Case l_msgRet
      Case MsgBoxResult.Yes
        モード = 休止監視.休止モード.サスペンド
      Case MsgBoxResult.No
        モード = 休止監視.休止モード.休止状態
      Case MsgBoxResult.Cancel
        モード = 休止監視.休止モード.未処理
    End Select
  End Sub

  'イベント/システム/WindowsProc
  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If Not m_obj休止.メッセージ処理(m) Then
      Return
    End If
    MyBase.WndProc(m)
  End Sub

End Class



※Class1.vb
--------------------------------------------------------------------------------
Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Public Class 休止監視

#Region "属性"
  Public Event 発生通知(ByRef モード As 休止モード)
  Public Event 発生処理(ByVal モード As 処理モード)

#Region "定数"
  Private Const WM_POWERBROADCAST As Integer = &H218
  Private Const PBT_APMQUERYSUSPEND As Integer = &H0
  Private Const BROADCAST_QUERY_DENY As Integer = &H424D5144
#End Region

#Region "型"
  Private Structure tagLUID
    Dim LowPart As Integer
    Dim HighPart As Integer
  End Structure
  Private Structure LUID_AND_ATTRIBUTES
    Dim Luid As tagLUID
    Dim Attributes As Integer
  End Structure
  Private Structure TOKEN_PRIVILEGES
    Dim PrivilegeCount As Integer
    Dim Privileges As LUID_AND_ATTRIBUTES
  End Structure
#End Region

#Region "列挙"
  Public Enum 休止モード
    未処理
    サスペンド
    休止状態
  End Enum
  Public Enum 処理モード
    再開
    休止
  End Enum
#End Region

#Region "API"
  <DllImport("advapi32.dll", SetLastError:=True)> _
    Private Shared Function OpenProcessToken( _
          ByVal ProcessHandle As IntPtr, _
          ByVal DesiredAccess As Integer, _
          ByRef TokenHandle As IntPtr _
        ) As Boolean
  End Function

  <DllImport("advapi32.dll", SetLastError:=True)> _
  Private Shared Function LookupPrivilegeValue( _
          ByVal pSystemName As String, _
          ByVal lpName As String, _
          ByRef lpLuid As tagLUID _
        ) As Boolean
  End Function
  <DllImport("advapi32.dll", SetLastError:=True)> _
    Private Shared Function AdjustTokenPrivileges( _
          ByVal TokenHandle As IntPtr, _
          ByVal DisableAllPrivileges As Boolean, _
          ByRef NewState As TOKEN_PRIVILEGES, _
          ByVal BufferLength As Integer, _
          ByVal PreviousState As IntPtr, _
          ByVal ReturnLength As IntPtr _
      ) As Boolean
  End Function
  <DllImport("kernel32.dll", SetLastError:=True)> _
  Private Shared Function SetSystemPowerState( _
          ByVal fSuspend As Boolean, _
          ByVal fForce As Boolean _
      ) As Boolean
  End Function
  <DllImport("user32.dll", SetLastError:=True)> _
  Private Shared Function ExitWindowsEx( _
          ByVal flag As Integer, _
          ByVal reserved As Integer _
      ) As Boolean
  End Function
#End Region

#End Region

#Region "メソッド"

#Region "メソッド_PUBLIC"
  'サスペンドを行う
  Public Sub 実行_サスペンド()
    Call 実行_休止処理(True)
  End Sub
  '休止状態を行う
  Public Sub 実行_休止状態()
    Call 実行_休止処理(False)
  End Sub

  'WindowsProc処理
  Public Function メッセージ処理(ByRef m As Windows.Forms.Message) As Boolean
    Dim l_blnRet As Boolean = True

    If (m.Msg = WM_POWERBROADCAST) And (m.WParam.ToInt32 = PBT_APMQUERYSUSPEND) Then
      l_blnRet = False
      '休止イベントの破棄
      m.Result = New IntPtr(BROADCAST_QUERY_DENY)

      'この中でイベントを発生させず、タイマを生成し、そのタイマイベント内部で処理を行う
      Dim l_objタイマ As New tmpタイマ()
      AddHandler l_objタイマ.Elapsed, AddressOf objタイマ_Elapsed
    End If

    Return l_blnRet
  End Function
#End Region

#Region "メソッド_PRIVATE"
  '休止処理メイン
  Private Sub 実行_休止処理(ByVal l_blnサスペンド As Boolean)
    Const TOKEN_QUERY As Integer = &H8
    Const TOKEN_ADJUST_PRIVILEGES As Integer = &H20
    Const SE_SHUTDOWN_NAME As String = "SeShutdownPrivilege"
    Const SE_PRIVILEGE_ENABLED As Integer = &H2

    Dim l_blnRet As Boolean

    '// プロセスのハンドルを取得する。
    Dim l_PronWnd As IntPtr = Diagnostics.Process.GetCurrentProcess().Handle

    '// Token を取得する。
    Dim l_TpkenWnd As IntPtr = IntPtr.Zero
    l_blnRet = OpenProcessToken(l_PronWnd, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), l_TpkenWnd)

    '// LUID を取得する。
    Dim l_udtLuid As tagLUID
    l_blnRet = LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, l_udtLuid)

    '// 特権をセットする。
    Dim tp As TOKEN_PRIVILEGES = New TOKEN_PRIVILEGES()
    tp.PrivilegeCount = 1
    tp.Privileges = New LUID_AND_ATTRIBUTES()
    tp.Privileges.Luid = l_udtLuid
    tp.Privileges.Attributes = SE_PRIVILEGE_ENABLED
    l_blnRet = AdjustTokenPrivileges(l_TpkenWnd, False, tp, 0, IntPtr.Zero, IntPtr.Zero)

    '休止処理実行
    '第2引数をTRUEにすることで、強制実行
    Call SetSystemPowerState(l_blnサスペンド, True)
  End Sub
#End Region

#End Region

#Region "イベント"

#Region "イベント_定義"
  'イベント/クラス/生成時
  Public Sub New()
    'システムの電源状態変化イベントを、内部メソッドへ引き込む
    AddHandler SystemEvents.PowerModeChanged, AddressOf SystemEvents_PowerModeChanged
  End Sub
  'イベント/クラス/破棄時
  Protected Overrides Sub Finalize()
    MyBase.Finalize()
    'システムの電源状態変化イベントを、内部メソッドからはずす
    RemoveHandler SystemEvents.PowerModeChanged, AddressOf SystemEvents_PowerModeChanged
  End Sub
#End Region

#Region "イベント_WindowsProc_PowerModeChanged"
  'イベント/電源/状態変化時
  Private Sub SystemEvents_PowerModeChanged(ByVal sender As Object, ByVal e As PowerModeChangedEventArgs)
    Select Case e.Mode
      Case PowerModes.Resume
        RaiseEvent 発生処理(処理モード.再開)
      Case PowerModes.Suspend
        RaiseEvent 発生処理(処理モード.休止)
    End Select
  End Sub
#End Region

#Region "イベント_内部タイマ"
  'イベント/タイマ/タイマ
  Private Sub objタイマ_Elapsed(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs)
    Dim l_objタイマ As tmpタイマ = CType(sender, tmpタイマ)
    Dim l_休止モード As 休止モード = 休止モード.未処理

    'イベントとの関連付けを切り離す
    RemoveHandler l_objタイマ.Elapsed, AddressOf objタイマ_Elapsed
    l_objタイマ.Dispose()

    '問合せ中に、再度休止関連イベントが行われたとき対策
    Static s_bln多重問合せ回避フラグ As Boolean = False
    If s_bln多重問合せ回避フラグ Then
      Return
    End If

    s_bln多重問合せ回避フラグ = True

    '問い合わせを行う
    RaiseEvent 発生通知(l_休止モード)

    '戻り値によって処理を行う
    Select Case l_休止モード
      Case 休止モード.サスペンド
        Call 実行_サスペンド()
      Case 休止モード.休止状態
        Call 実行_休止状態()
    End Select

    s_bln多重問合せ回避フラグ = False

  End Sub
#End Region

#End Region

#Region "内部タイマー"
  Private Class tmpタイマ
    Inherits Timers.Timer
    Public Sub New()
      Me.Interval = 1
      Me.Enabled = True
    End Sub
  End Class
#End Region

End Class

>WinXPとVB.NETで休止やスタンバイのイベントを受け取るには?
WndProc (WindowsProcとも言われたりします)
を利用します。

ただ、これはシステムフックをする事になるので、ここでは
1・重い負荷を与える処理
2・ユーザからの入力を待機する処理
はご法度です!!


もしそのような処理を入れた場合、
1・システムが次の処理を走らすことができず、動作が不安定になる
2・システムが次の処理を走らすために、アプリ側で捕まえられた処理をタイムアウトとして扱い、アプリ側の変更を受け付...続きを読む

Q外部exe呼び出しの方法 ShellExecuteEx, System...

VC++6での質問す。
◆やりたいこと◆
(1)内部から外部exeを引数ありで呼び出し、処理をさせます。
(2)その外部exeの結果コードを内部的に受け取り、エラー処理させます。
(3)外部exeの処理実行中は、できればDOS窓を非表示にさせます。

system()呼び出しは最も簡単なのですが、(3)が上手くできませんでした。

◆やってみた方法◆
こちらの過去質問も参考に見よう見まねでShellExecuteExを使ってやってみようとしました。

SHELLEXECUTEINFO sei;
DWORDdwRC;
LPVOID msg;
BOOLres;

ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.nShow = SW_HIDE;
sei.lpVerb = (LPCTSTR)cmd;// cmdの中は、"hoge.exe param1 param2"

res=ShellExecuteEx( &sei );

WaitForSingleObject( sei.hProcess, INFINITE );
GetExitCodeProcess( sei.hProcess, &dwRC );
CloseHandle(sei.hProcess);

if(res != FALSE){
MessageBox( "OK", "result", MB_OK );
}else{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwRC,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &msg,
0,
NULL
);
MessageBox( msg, "result", MB_OK | MB_ICONERROR );
LocalFree(msg);
}

以上で実行しようとすると、
「指定されたファイルに対してこの操作を行うアプリケーションが関連付けられていません・・・」
のエラーになってしまいます。
どのように改善していけばよいでしょうか。

ソースはあちこちのものをミックスして書いていて、半分意味も分からずで、とんでもないことをしているかも知れません(VCは初心者で、ハンドルとかクラス、プロセスとかの知識に乏しいです)
また、まったく別で良い方法(CreateProcessの方が簡単だとか)があれば、よろしくお願いします。

VC++6での質問す。
◆やりたいこと◆
(1)内部から外部exeを引数ありで呼び出し、処理をさせます。
(2)その外部exeの結果コードを内部的に受け取り、エラー処理させます。
(3)外部exeの処理実行中は、できればDOS窓を非表示にさせます。

system()呼び出しは最も簡単なのですが、(3)が上手くできませんでした。

◆やってみた方法◆
こちらの過去質問も参考に見よう見まねでShellExecuteExを使ってやってみようとしました。

SHELLEXECUTEINFO sei;
DWORDdwRC;
LPVOID msg;
BOOLres;

ZeroMemory(&se...続きを読む

Aベストアンサー

SHELLEXECUTEINFO構造体に設定する値が間違っています。
この場合は下記の値を設定します。
sei.lpVerb = "open"
sei.lpFile = "hoge.exe"
sei.lpParameters = "param1 param2"

あとGetExitCodeProcess関数を使用するためにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があるのでOpenProcess関数を使用してアクセス権を割り当ててください。


人気Q&Aランキング

おすすめ情報