いつもおせわになっております。

ただいま、Visual C++ 2008 Express Edition を使いまして、クリップボード拡張アプリを作っております。

実装したい機能として・・・
 A.クリップボードにデータがコピーされる度に、クリップボードのデータを取得する。
 B.ただし、クリップボード上のデータは消さない。

というものがあります。

この使用を実装するために、下記のようにデータ存在の有無をタイマーな
どでポーリングすれば良いと考えました。

>IDataObject^data = System::Windows::Forms::Clipboard::GetDataObject();
>pictureShowPicture->Image->Dispose();
>if(data->GetDataPresent(DataFormats::Bitmap) == true){

しかし、この方法だと、一回でもデータがクリップボードにコピーされると、その後もずっと「データが存在する」状態となってしまい、新しいデータが来たのかどうか判断が出来ません。
クリップボード上のデータを消せば、「データが存在しない」状態となり、次にデータがコピーされたことが分かるのですが、クリップボード上のデータは消さない実装としたいのです。


このため、下記のようにすれば問題が解決できると思いました。
 1.何らかの方法でクリップボードにデータがコピーされたという通知を受け取る。
 2.現在のデータが直前のデータと同じか異なるかを判断する。
   (ポーリングしておいて、データが異なれば新規データと判断)

上記1,2について、実現方法をご存知の方は教えていただけませんでしょうか。

ちなみに、受け取りたいデータ形式は、ビットマップ形式画像およびテキスト形式です。

お忙しいところ恐縮ですが、よろしくお願いいたします。

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

A 回答 (1件)

 こんばんは。



 win32APIを呼び出して良ければ、こういった手段があります。
 http://wisdom.sakura.ne.jp/system/winapi/win32/w …

 以下は、クリップボードが変更される度に、メッセージボックスを出します。参考程度に。

//メンバ変数
private: HWND m_hWndNext;

//自分をクリップボードビューワに登録
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
this->m_hWndNext = ::SetClipboardViewer(static_cast<HWND>(this->Handle.ToPointer()));
}

//自分をクリップボードビューワから解除
private: System::Void Form1_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e)
{
::ChangeClipboardChain(static_cast<HWND>(this->Handle.ToPointer()), this->m_hWndNext);
}

//ウィンドウプロシージャのオーバーライド
public: virtual System::Void WndProc(System::Windows::Forms::Message% m) override
{
switch(m.Msg)
{
//クリップボードが更新されると此処に飛び込んでくる
case WM_DRAWCLIPBOARD:
{
//クリップボードを開く
::OpenClipboard(static_cast<HWND>(this->Handle.ToPointer()));

//クリップボードフォーマットを総当りで調べて、何か見つかれば直に中断
HANDLE hClipboard = NULL;
for(UINT uFormat = ::EnumClipboardFormats(0); uFormat != 0; uFormat = ::EnumClipboardFormats(uFormat))
{
hClipboard = ::GetClipboardData(uFormat);
//クリップボード内にデータを発見
if(hClipboard)break;
}

//クリップボードを閉じる
::CloseClipboard();

if(hClipboard != NULL)
System::Windows::Forms::MessageBox::Show("クリップボードにデータが来ました");

::SendMessage(this->m_hWndNext, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32());
}
break;

case WM_CHANGECBCHAIN:
if(this->m_hWndNext == static_cast<HWND>(m.WParam.ToPointer()))
this->m_hWndNext = static_cast<HWND>(m.LParam.ToPointer());
else if(this->m_hWndNext != NULL)
::SendMessage(this->m_hWndNext, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32());
break;
}
this->Form::WndProc(m);
}

この回答への補足

ご回答ありがとうございます。

さっそくやってみました。
結果は・・・・いちおう思っていたことが実現できました。
ありがとうございます。

若干、コードを変えたりしたので、その部分も含めて書いて置きます。

***stdafx.h
#include <windows.h>
#pragma comment(lib, "user32.lib")
//このライブラリを使うように指示。これがないとリンクしてくれない。

***Form1.h
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {

//クリップボードビュワーに登録。
this->m_hWndNext = ::SetClipboardViewer(static_cast<HWND>(this->Handle.ToPointer()));
}

public: virtualSystem::Void WndProc(System::Windows::Forms::Message% m) override
{
System::Windows::Forms::IDataObject^data = System::Windows::Forms::Clipboard::GetDataObject();

this->Form::WndProc(m); //ここにおかないとエラーになる。なぜだろう???

switch(m.Msg)
{
case WM_DRAWCLIPBOARD:
if(data->GetDataPresent(DataFormats::Bitmap) == true)
{
textHashCode->Text = data->GetHashCode().ToString();
pictureShowPicture->Image = (Image^)data->GetData(DataFormats::Bitmap);
//フォルダの最後の文字を "\" にする。
if( textFolderDestination->Text[textFolderDestination->Text->Length - 1] != '\\'){
textFolderDestination->Text = textFolderDestination->Text + "\\";
}
}

pictureShowPicture->Image->Save(textFolderDestination->Text + textHashCode->Text + ".jpg");

::SendMessage(this->m_hWndNext, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32());
break;

case WM_CHANGECBCHAIN:

if(this->m_hWndNext == static_cast<HWND>(m.WParam.ToPointer())){

this->m_hWndNext = static_cast<HWND>(m.LParam.ToPointer());
}
else if(this->m_hWndNext != NULL){
::SendMessage(this->m_hWndNext, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32());
}
break;




}
}

補足日時:2009/05/18 23:55
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
さっそくやってみます。

お礼日時:2009/05/18 23:06

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

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

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

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

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) {
// ここに処理を書く
}
という関数が必要なようです。

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() を使えとか書いてあるけど。

Qクリップボードから画像取得

前回質問させていただいたのですが
質問を打ち切ってしまい そのあと試したのですが
うまくいきません。
Window画面に表示はしたくないのです。
クリップボードの画像をファイルに保存したいのですが
以下のソースでどこがおかしいでしょうか

case IDM_SAVE:

hdc = BeginPaint(hWnd, &ps);
if (IsClipboardFormatAvailable(CF_BITMAP))
{
OpenClipboard(hWnd);
hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);

hdc_mem = CreateCompatibleDC(hdc);
SelectObject(hdc_mem, hBitmap);
GetObject(hBitmap,(int)sizeof(bmp_info),&bmp_info);
width=bmp_info.bmWidth;
height=bmp_info.bmHeight;


MessageBox(NULL,"Debug 0","Debug0",MB_OK);
fopen_s(&fpt,"ClipBoard.bmp","wb");

BITMAPINFOHEADER bmih;
BITMAPFILEHEADER bmfh;
//RGBQUAD rgbquad;

DWORD filesize,bmfhsize,bmihsize;
bmfhsize=sizeof(bmfh);
bmihsize=sizeof(bmih);
//rgbquadsize=sizeof(rgbquad);

filesize=bmfhsize+bmihsize+width*height;
::ZeroMemory(&bmfh, bmfhsize);
::ZeroMemory(&bmih, bmihsize);

bmfh.bfType=0x4d42;
bmfh.bfSize=filesize;
bmfh.bfReserved1=0;
bmfh.bfReserved2=0;
bmfh.bfOffBits=bmfhsize+bmihsize;

bmih.biSize=bmihsize;
bmih.biWidth=width;
bmih.biHeight=height;
bmih.biPlanes=1;
bmih.biBitCount=32;
bmih.biClrUsed=2;
bmih.biCompression=BI_RGB;//無圧縮形式
bmih.biSizeImage=0;//BI_RGBをセットした場合、0が好ましいとMSDNに書いてあった。
bmih.biXPelsPerMeter=0;
bmih.biYPelsPerMeter=0;
bmih.biClrImportant=0;

MessageBox(NULL,"Debug 1","Debug1",MB_OK);
fwrite(&bmfh,sizeof(unsigned char),bmfhsize,fpt);
fwrite(&bmih,sizeof(unsigned char),bmihsize,fpt);
MessageBox(NULL,"Debug 2","Debug2",MB_OK);
fwrite(&bmp_info.bmBits,1,3*width*height,fpt);
MessageBox(NULL,"Debug 3","Debug3",MB_OK);

fclose(fpt);
DeleteDC(hdc_mem);
CloseClipboard();
}
EndPaint(hWnd, &ps);

break;



}
break;



画像の先頭アドレスがどこにおさめられているのかが
わかりません
fwrite(&bmp_info.bmBits,1,3*width*height,fpt);
がおかしい様なのですがよくわかりません。

よろしくおねがいします。

前回質問させていただいたのですが
質問を打ち切ってしまい そのあと試したのですが
うまくいきません。
Window画面に表示はしたくないのです。
クリップボードの画像をファイルに保存したいのですが
以下のソースでどこがおかしいでしょうか

case IDM_SAVE:

hdc = BeginPaint(hWnd, &ps);
if (IsClipboardFormatAvailable(CF_BITMAP))
{
OpenClipboard(hWnd);
hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);

hdc_mem = CreateCompatibleDC(hdc);
SelectObject(hdc_mem, hBitmap)...続きを読む

Aベストアンサー

 こんばんは。
 クリップボードから取り出したHBITMAPを、新たに作成したDIBのHBITMAPに複写し、DIBのHBITMAPをセーブに使用します。
 以下は32bitの「screen shot.bmp」を作成します。参考程度に。

static void InitHDR(LPBITMAPINFOHEADER pbmih, DWORD width, DWORD height)
{
pbmih->biSize = sizeof(*pbmih);
pbmih->biPlanes = 1;
pbmih->biCompression = BI_BITFIELDS;
pbmih->biBitCount = 32;
pbmih->biWidth = width;
pbmih->biHeight= height;
}

static void InitFields(LPDWORD p)
{
p[0] = 0xff0000;
p[1] = 0xff00;
p[2] = 0xff;
}

static HBITMAP CreateDIBFrom(HBITMAP hBitmap)
{
LPBITMAPINFO pbmi = static_cast<LPBITMAPINFO>(::calloc(1, sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD) * 3)));

BITMAP bitmap;
::GetObject(hBitmap, sizeof(bitmap), &bitmap);

::InitHDR(&pbmi->bmiHeader, bitmap.bmWidth, bitmap.bmHeight);
::InitFields(reinterpret_cast<LPDWORD>(&pbmi->bmiColors));

LPVOID pvBits = NULL;
HBITMAP hDIB = ::CreateDIBSection(NULL, pbmi, DIB_RGB_COLORS, &pvBits, NULL, 0);
if(hDIB)
{
HDC hDCDest = ::CreateCompatibleDC(NULL);
HDC hDCSrc = ::CreateCompatibleDC(NULL);

::SelectObject(hDCDest, hDIB);
::SelectObject(hDCSrc, hBitmap);

::BitBlt(hDCDest, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hDCSrc, 0, 0, SRCCOPY);

::DeleteDC(hDCDest);
::DeleteDC(hDCSrc);
}

::free(pbmi);
return hDIB;
}

static BOOL SaveDIB(LPSTR strFileName, HBITMAP hBitmap)
{
DIBSECTION dib;
::GetObject(hBitmap, sizeof(dib), &dib);

BITMAPFILEHEADER bmfh = {0};
bmfh.bfType= 0x4d42;
bmfh.bfOffBits= sizeof(bmfh) + sizeof(dib.dsBmih) + sizeof(dib.dsBitfields);
bmfh.bfSize= bmfh.bfOffBits + dib.dsBmih.biSizeImage;

FILE* fp = ::fopen(strFileName, "wb");
if(fp == NULL)return FALSE;

::fwrite(&bmfh, sizeof(bmfh), 1, fp);
::fwrite(&dib.dsBmih, sizeof(dib.dsBmih), 1, fp);
::fwrite(dib.dsBitfields, sizeof(dib.dsBitfields), 1, fp);
::fwrite(dib.dsBm.bmBits, dib.dsBmih.biSizeImage, 1, fp);
::fclose(fp);

return TRUE;
}

//ウィンドウプロシージャの中で、
case IDM_SAVE:
if(!::IsClipboardFormatAvailable(CF_BITMAP))
break;

::OpenClipboard(hWnd);
try
{
HBITMAP hBitmap = static_cast<HBITMAP>(::GetClipboardData(CF_BITMAP));
if(hBitmap == NULL)
throw TEXT("クリップボードからビットマップを取れなかった");

HBITMAP hDIB = ::CreateDIBFrom(hBitmap);
if(hDIB == NULL)
throw TEXT("DIBへの変換に失敗した");

const BOOL bResult = ::SaveDIB("screen shot.bmp", hDIB);

::DeleteObject(hDIB);

if(bResult == FALSE)
throw TEXT("セーブに失敗した");

}
catch(LPCTSTR lpctstrError)
{
::MessageBox(hWnd, lpctstrError, TEXT("失敗しました"), IDOK);
}

::CloseClipboard();
break;

 こんばんは。
 クリップボードから取り出したHBITMAPを、新たに作成したDIBのHBITMAPに複写し、DIBのHBITMAPをセーブに使用します。
 以下は32bitの「screen shot.bmp」を作成します。参考程度に。

static void InitHDR(LPBITMAPINFOHEADER pbmih, DWORD width, DWORD height)
{
pbmih->biSize = sizeof(*pbmih);
pbmih->biPlanes = 1;
pbmih->biCompression = BI_BITFIELDS;
pbmih->biBitCount = 32;
pbmih->biWidth = width;
pbmih->biHeight= height;
}

static void InitFields(LPDWORD p)...続きを読む

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関数を使用してアクセス権を割り当ててください。

Qfatal error LNK1120: 外部参照 1 が未解決です

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
  char tel[20];
  char address[20];
};

void message( void );
void input( FILE *fp, int cnt , struct meibo *a, int *end );

void main( void )
{
  struct meibo a[20];
  FILE *fp;
  int cnt, end;

  if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){
    printf( "Can not open the meibo.dat.\n" );
    exit( 1 );
  }

  message();

  fprintf( fp, "番号, 名前, TEL, 住所\n" );
  fflush( fp );

  cnt = 0;
  end = 0;
  while( end == 0 ){
    input( fp, cnt, &a[cnt], &end );
    cnt++;
    fflush( fp );
    if( cnt == 20 ){
      printf( "人数が一杯です.終了します.\n" );
      end = 1;
    }
  }
  fclose( fp );
}

void message( void )
{
  printf( "名前, TEL, 住所, endを入力してください.\n" );
  printf( "継続の時はend=0," );
  printf( "中止の時は,end=1と入力してください.\n" );
}

void input( FILE *fp, int cnt, struct meibo *a, int *end )
{
  printf( "名前-->" );
  scanf( "%s", a->name );
  printf( "TEL -->" );
  scanf( "%s", a->tel );
  printf( "住所-->" );
  scanf( "%s", a->address );
  printf( "Exit? Continue:0 Exit:1 -->" );
  scanf( "%d", end );
  printf( "\n" );
  fprintf( fp, "%2d, %s, %s, %s\n",
    cnt+1, a->name, a->tel, a->address );
}

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
...続きを読む

Aベストアンサー

http://www.a.math.ryukoku.ac.jp/~hig/course/compsci2_2005/man/faq.html
にある現象と同じではないでしょうか、一度お試しください。

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...続きを読む

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。


人気Q&Aランキング

おすすめ情報