◆情報◆
メール:ct.soft.blog○gmail.com(○を@に変えてください。)
SkypeIDは"y_takanashi"/Twitterはy_r_takanashi
TOP/About/BBS/UPLOADER
自作ソフト公開ページ

rankinggg.gif只今ブログランキングに参加中です。クリックお願いします。
◆報告◆
(110726)RSSをドリコムRSS Liteからlivedoor BlogRollに変更。NEW!
(100717)記事下部にRayna's Pageへのリンクを表示するように。
(100505)Twitterの発言を表示するように。
(100430)タグクラウドを導入。
(100405)ブログ用のメールアドレスを変更。
(100208)テンプレートを大幅変更。3カラムから2カラムへ。
(091028)コメントの英数字フィルタを90%で導入。
(091024)コメント欄のメールアドレス項目を廃止。
(091023)コメント投稿時に画像認証をしないように変更。
(090821)副管理人になつだ氏が就任。
(090813)RSS(drecom)をiframeで外部HTMLから読み込むように変更。
(090717)Torrent系の記事を修正。
(090625)コメント欄で正常にAAを表示できる機能を追加&コメント入力欄拡大
(090221)ブログ内検索にコメント検索等の機能追加。
(090219)LimeWire系の記事を非公開に。
(090216)Torrent系の記事のコメントとトラックバックを一時的に禁止。
(090202)ランキングバナー付近の文字列を変更。
(080724)あらゆる環境でコメント投稿できないバグを修正。
(080722)ブログをIE系で閲覧すると、正常に表示できないバグを修正。
(080722)コメント欄に要らない機能を追加
(080719)コメント欄にプレビュー機能を追加。
(080715)コメントの際に、パスワードが未入力の場合、警告を表示するように設定。
(080714)コメント欄に絵文字装飾機能(制限付)を追加。
(08067)コメント欄に番号を表示するように設定。
(080603)報告欄の順番を逆に修正。
(080603)コメント欄を色々と修正。
(080601)銅を増量。最大1ファイル10MBまで可能。
(080526)コメント削除ボタンを訂正
(080518)相互リンク&お勧めリンク欄の全角文字をすべて半角文字に変更。
(080517)Faviconを設定。
(080517)他ブログを訪問した際に履歴が残るように設定。
(080504)「あやしい検索」を追加。
(080430)ランキング投票ボタンを記事に毎回追加。
(080413)コメントを管理人の許可なしで表示可能に。
(080303)相互リンクの方々の新着記事表示欄を追加。
(080302)コメント投稿確認画面に画像認証を追加。
(071218)どうやらこのブログの存在する価値がないようなので、閉鎖を検討中。(嘘)
(071218)指摘があったので一部の記事を削除。
(071215)諸事情によりアクセスカウンタの設定を戻す。

--年--月--日 (--:--:--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。




スポンサーリンク







スポンサーリンク






宣伝
アップローダからダウンロードしたZIPやRAR等のファイル名を元に戻す「Ashley

ウインドウにドラッグ&ドロップするだけで、様々な書庫の「再圧縮」「圧縮」「解凍」を行う「gui4reces

マウスの移動とホイールの回転やMigemoインクリメンタルサーチでウインドウを切り替える「Tascher


↓この記事がお役に立てればクリックして下さい。
rankinggg.gif
カテゴリ : スポンサー広告記事のURL | by 

2010年06月10日 (17:13:45)

[C言語]プログラムをスタートアップに追加する方法[Win32API]

よく、偉大な先人の方々のプログラムで、
「Windowsと共に起動する」や「スタートアップに追加する」等と言ったオプションがありますが、
今回は、"C言語で"それを実装しましょうと言うお話。

仕組みとしては、スタートアップフォルダを取得し、
そこへ自分自身のショートカットを作成する、と言う流れになっています。

COM使用に関して、色々とgdgdがあったのでまとめてみました。
動くと言う噂があるサンプルコードも掲載しています。

詳しくは「続きを読む」をクリック。




スポンサーリンク



さてさて、いつも通り早速ネットからコピペコピペ...

CoInitialize(NULL);
IShellLink *pShellLink=NULL;
IPersistFile *pPersistFile=NULL;
HRESULT hRet=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&pShellLink);



hRet=pShellLink->QueryInterface(pShellLink,IID_IPersistFile,(void**)&pPersistFile);



pShellLink->Release();



CoUninitialize();
※かなり端折っています。

すると、大量のエラーが...


hogehoge.c:127:2: error: incompatible type for argument 1 of 'CoCreateInstance'
c:\msys\mingw\bin\../lib/gcc/mingw32/4.5.0/../../../../include/objbase.h:135:11: note: expected 'const struct CLSID * const' but argument is of type 'GUID'
hogehoge.c:127:2: error: incompatible type for argument 4 of 'CoCreateInstance'
c:\msys\mingw\bin\../lib/gcc/mingw32/4.5.0/../../../../include/objbase.h:135:11: note: expected 'const struct IID * const' but argument is of type 'GUID'
hogehoge.c:130:18: error: 'IShellLink' has no member named 'QueryInterface'
hogehoge.c:133:19: error: 'IShellLink' has no member named 'SetPath'
hogehoge.c:137:16: error: 'IShellLink' has no member named 'SetArguments'
hogehoge.c:141:16: error: 'IShellLink' has no member named 'SetDescription'
hogehoge.c:145:16: error: 'IShellLink' has no member named 'SetWorkingDirectory'
hogehoge.c:155:23: error: 'IPersistFile' has no member named 'Save'
hogehoge.c:160:16: error: 'IPersistFile' has no member named 'Release'
hogehoge.c:162:13: error: 'IShellLink' has no member named 'Release'



objidl.h、shlobj.hのinclude、
ole32、uuidのLinkも行っているのですが...

Google先生に訊いた所、
関数 CoCreateInstance() を使用したコードでコンパイルエラーがでる-VC++-水無瀬の部屋がHITしました。
引用させていただくと、

 関数 CoCreateInstance() は次のように宣言されています。
  WINOLEAPI CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR *ppv );

 C言語では、型 REFCLSID は CLSID 型変数へのポインタです。
 C++言語では、型 REFCLSID は CLSID 型変数への参照です。
 C言語では、型 REFIID は IID 型変数へのポインタです。
 C++言語では、型 REFIID は IID 型変数への参照です。




         ナ ゝ   ナ ゝ /    十_"    ー;=‐         |! |!
          cト    cト /^、_ノ  | 、.__ つ  (.__    ̄ ̄ ̄ ̄   ・ ・
ミ::::;/   ゙̄`ー-.、     u  ;,,;   j   ヾk'! ' l / 'レ ^ヽヘ\   ,r゙ゞ゙-"、ノ / l! !ヽ 、、 |
ミ/    J   ゙`ー、   " ;, ;;; ,;; ゙  u ヾi    ,,./ , ,、ヾヾ   | '-- 、..,,ヽ  j  ! | Nヾ|
'"       _,,.. -─ゝ.、   ;, " ;;   _,,..._ゞイ__//〃 i.! ilヾゞヽ  | 、  .r. ヾ-、;;ノ,.:-一'"i
  j    /   ,.- 、  ヾヽ、 ;; ;; _,-<  //_,,\' "' !| :l ゙i !_,,ヽ.l `ー─--  エィ' (. 7 /
      :    ' ・丿   ̄≠Ξイ´,-、 ヽ /イ´ r. `ー-'メ ,.-´、  i     u  ヾ``ー' イ____
       \_    _,,......::   ´゙i、 `¨ / i ヽ.__,,... '  u ゙l´.i・j.冫,イ゙l  / ``-、..- ノ :u l ,- ,-\ / ̄ ̄ ̄ ̄\
   u      ̄ ̄  彡"   、ヾ ̄``ミ::.l  u   j  i、`ー' .i / /、._    `'y   /, |  ・|・ | ヽ_____ヽ
              u      `ヽ  ゙:l   ,.::- 、,, ,. ノ ゙ u ! /_   ̄ ー/ u /  `-●-' \ヽ , ─ 、 , ─ |
           _,,..,,_    ,.ィ、  /   |  /__   ``- 、_    l l  ``ーt、_ /  / ──  | ──ヽ|   ・|・   |
  ゙   u  ,./´ "  ``- 、_J r'´  u 丿 .l,... `ー一''/   ノ  ト 、,,_____ ゙/ /..  ── | ── .|`─ 'っ - ´|
        ./__        ー7    /、 l   '゙ ヽ/  ,. '"  \`ー--- ",.::く、 |    ── | ── |.____) /
       /;;;''"  ̄ ̄ ───/  ゙  ,::'  \ヾニ==='"/ `- 、   ゙ー┬ '´ / \.____|__) / ___/
、      .i:⌒`─-、_,....    l   /     `ー┬一'      ヽ    :l  /  , ' `ソヽ      /l \/\| \
ヾヽ     l      `  `ヽ、 l  ./  ヽ      l         )  ,; /   ,'    '^i━(t)━━l |      | |


そこで、早速修正してみる...が、
以下のエラーが消えてくれません。

hogehoge.c:130:18: error: 'IShellLink' has no member named 'QueryInterface'
hogehoge.c:133:19: error: 'IShellLink' has no member named 'SetPath'
hogehoge.c:137:16: error: 'IShellLink' has no member named 'SetArguments'
hogehoge.c:141:16: error: 'IShellLink' has no member named 'SetDescription'
hogehoge.c:145:16: error: 'IShellLink' has no member named 'SetWorkingDirectory'
hogehoge.c:155:23: error: 'IPersistFile' has no member named 'Save'
hogehoge.c:160:16: error: 'IPersistFile' has no member named 'Release'
hogehoge.c:162:13: error: 'IShellLink' has no member named 'Release'


どうしようかと思っていた矢先、先程のページの「関連」に、
インターフェイスを使用したコードでコンパイルエラーがでる-VC++-水無瀬の部屋のリンクを発見。

エラーメッセージの例:
 'lpVtbl' : 'インターフェイス' のメンバではありません。
 'メソッド' : 'インターフェイス' のメンバではありません。
 'ポインタによる関数の呼び出し' : 実引数が少なすぎます。
 'メソッド' : 関数が不正な 3 個の実引数をともなって呼び出されました。



同じく引用させていただくと、

 インターフェイスの使い方は、C言語とC++言語とで異なります。

 C言語では、メソッドの呼び出しを、メンバ lpVtbl を介して行います。
 C++言語では、メソッドの呼び出しを、メンバ lpVtbl を介さずに行います。
 C言語では、メソッドの第一引数に、自分自身へのポインタを渡します。
 C++言語では、メソッドの第一引数は、自動的に渡されます。



な、なんだってー!!(AA略

これらの事を踏まえ、サンプルを以下に掲載。
TDM-GCC 4.5.0にて確認済み。


#define STRICT
//SHGetSpecialFolderPath()の為
#ifndef _WIN32_IE
#define _WIN32_IE 0x400
#endif
#include<windows.h>
#include<tchar.h>
#include<objidl.h>
#include<shlobj.h>

BOOL CreateShortcut(LPCTSTR lpszShortcutFile,LPCTSTR lpszTargetFile,LPCTSTR lpszArgs,LPCTSTR lpszDescription,LPCTSTR lpszDir){
BOOL bRet=FALSE;
//COMの初期化を行う
CoInitialize(NULL);
//シェルリンク用インターフェイス
IShellLink *pShellLink=NULL;
//ファイル保存用インターフェイス
IPersistFile *pPersistFile=NULL;
//IShellLinkのポインタを取得する
HRESULT hRet=CoCreateInstance(&CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,&IID_IShellLink,(void**)&pShellLink);
if(SUCCEEDED(hRet)){
//IPersistFileのポインタを取得する
hRet=pShellLink->lpVtbl->QueryInterface(pShellLink,&IID_IPersistFile,(void**)&pPersistFile);
if(SUCCEEDED(hRet)){
//リンクパス
hRet=pShellLink->lpVtbl->SetPath(pShellLink,lpszTargetFile);
if(SUCCEEDED(hRet)){
//実行時の引数
if(lpszArgs){
pShellLink->lpVtbl->SetArguments(pShellLink,lpszArgs);
}
//説明文
if(lpszDescription){
pShellLink->lpVtbl->SetDescription(pShellLink,lpszDescription);
}
//作業ディレクトリ
if(lpszDir){
pShellLink->lpVtbl->SetWorkingDirectory(pShellLink,lpszDir);
}
#ifdef _UNICODE
//ショートカットファイルの保存
hRet=pPersistFile->lpVtbl->Save(pPersistFile,lpszShortcutFile,TRUE);
if(SUCCEEDED(hRet))bRet=TRUE;
#else //_UNICODE
WCHAR wszShortcutFile[MAX_PATH];
if(MultiByteToWideChar(CP_ACP,0,lpszShortcutFile,-1,wszShortcutFile,MAX_PATH)>0){
//ショートカットファイルの保存
hRet=pPersistFile->lpVtbl->Save(pPersistFile,wszShortcutFile,TRUE);
if(SUCCEEDED(hRet))bRet=TRUE;
}
#endif //_UNICODE
}
pPersistFile->lpVtbl->Release(pPersistFile);
}
pShellLink->lpVtbl->Release(pShellLink);
}
//COMを解放
CoUninitialize();
return bRet;
}

LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
TCHAR szStartUpPath[MAX_PATH];
TCHAR szModulePath[MAX_PATH];
switch(uMsg){
case WM_CREATE:
//スタートアップディレクトリのパスを取得
SHGetSpecialFolderPath(NULL,szStartUpPath,CSIDL_STARTUP,FALSE);
//ファイル名を結合
lstrcat(szStartUpPath,_T("\\Sample.lnk"));
//自分自身のパスを取得
GetModuleFileName(NULL,szModulePath,MAX_PATH);
//ショートカットを作成
CreateShortcut(szStartUpPath,szModulePath,NULL,NULL,NULL);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}


int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hInstPrev,LPSTR lpszCmdLine,int nCmdShow){
TCHAR szAppName[]=_T("Sample");
TCHAR szClassName[]=_T("SampleWindowClass");
HWND hWnd;
MSG msg;
WNDCLASSEX wc;
wc.cbSize =sizeof(WNDCLASSEX);
wc.style =0;
wc.lpfnWndProc =WindowProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInst;
wc.hIcon =(HICON)LoadImage(NULL,IDI_APPLICATION,IMAGE_ICON,0,0,LR_SHARED);
wc.hCursor =NULL;
wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName =NULL;
wc.lpszClassName =szClassName;
wc.hIconSm =(HICON)LoadImage(NULL,IDI_APPLICATION,IMAGE_ICON,0,0,LR_SHARED);
if(RegisterClassEx(&wc)==0)return 0;
hWnd=CreateWindowEx(0,
szClassName,
szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL);
if(hWnd==NULL)return 0;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0)>0){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}





gcc sample.c -o sample.exe -mwindows -lgdi32 -lole32 -luuid


とすると、無事exeファイルが作成されているはず...

間違いがあればコメントお願いします。

[追記](100727)作業ディレクトリを設定し忘れているのでご注意を...






スポンサーリンク






宣伝
アップローダからダウンロードしたZIPやRAR等のファイル名を元に戻す「Ashley

ウインドウにドラッグ&ドロップするだけで、様々な書庫の「再圧縮」「圧縮」「解凍」を行う「gui4reces

マウスの移動とホイールの回転やMigemoインクリメンタルサーチでウインドウを切り替える「Tascher


↓この記事がお役に立てればクリックして下さい。
rankinggg.gif
カテゴリ : 雑記記事のURL コメント (0) トラックバック (0) | by xxxRxxx

コメント

コメントの投稿

サイト管理者にのみ通知する

トラックバックURL

http://convenient.blog106.fc2.com/tb.php/820-5458ab69
Twitter

Twitter Updates

    follow me on Twitter
    プロフィール

    Main Administrator:xxxRxxx
    年齢:厨二病にかかる年齢です。
    生まれ:古都
    クラス:うしろゆび指され組
    出席番号:処刑台の階段の数
    趣味:PC・読書
    長所:画像のためならどこまでも
    短所:↑のせいでHDDが・・・
    目標:1日1回くらいの更新
    好きな言葉:人生全てが黒歴史

    bloge_1.png
    Sub
    Administrator:なつだ
    性別: ♂
    格言: 定石無くして布石なし
    趣味: ゲーム
    おすすめのゲーム: 「I wanna be the guy」と「英雄伝説 空の軌跡シリーズ」
    大好物: 金髪
    嫁: 金髪の方の天音


    改造マリオ1&2はこちら
    改造マリオ3はこちらで配布中

    iPodLinux導入方法はこちらで紹介

    Rockbox導入&マルチブートする方法はこちらで紹介

    podzilla0はこちらです。

    自作ソフト等はこちら

    カテゴリ
    最近の記事
    最近のコメント
    月別アーカイブ
    アクセスランキング

    アクセスランキング

    カウンター
    ◆相互リンク◆
    ◆お勧めリンク◆
    あやしい検索

    UIC

    中華

    その他
    タグクラウド
    RSSフィード

    Appendix


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。