ほっとひといき給湯室

ほっとひといき給湯室の掲示板です。お気軽にどうぞ!
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
Windows研究室1st
投稿日時: 12/01/14 11:10:05
投稿者: kumatti
投稿者のウェブサイトに移動

※ 現行のWindowsに関する事なら、何でもどうぞ。

投稿日時: 12/01/14 11:52:11
投稿者: kumatti
投稿者のウェブサイトに移動

・C++の関数定義(MSDN限定)から、引数を得る。
 
DeviceIoControl function
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363216%28v=vs.85%29.aspx
test.txt

BOOL WINAPI DeviceIoControl(
  __in         HANDLE hDevice,
  __in         DWORD dwIoControlCode,
  __in_opt     LPVOID lpInBuffer,
  __in         DWORD nInBufferSize,
  __out_opt    LPVOID lpOutBuffer,
  __in         DWORD nOutBufferSize,
  __out_opt    LPDWORD lpBytesReturned,
  __inout_opt  LPOVERLAPPED lpOverlapped
);

test.js
var FilePath = "test.txtへのパス";
var stm = new ActiveXObject("ADODB.Stream");
stm.open();
stm.type = 2;//adTypeText
stm.charset = "shift-jis";
stm.LoadFromFile(FilePath);
var s = stm.readtext();
stm.Close();
WScript.Echo(s);//確認用
var arr = s.match(/\s[\w]+,?\r\n/g);
WScript.Echo(arr);//確認用
s = arr.join("");
s = s.replace(/[\n\r]/g,"");
WScript.Echo(s);//確認用
WScript.Quit();

実行結果 APIの引数
 hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped

投稿日時: 12/01/15 13:57:58
投稿者: kumatti
投稿者のウェブサイトに移動

・VBAのDeclare文、自動作成(MSDN限定)
 
1)dll名とUnicodeかは自前で指定。
※引数は全て、Long型の値渡し。戻り値はLong型。
 
FindWindowEx function
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633500%28v=vs.85%29.aspx
test.txt

HWND WINAPI FindWindowEx(
  __in_opt  HWND hwndParent,
  __in_opt  HWND hwndChildAfter,
  __in_opt  LPCTSTR lpszClass,
  __in_opt  LPCTSTR lpszWindow
);

api.js
var FilePath = 'test.txtへのパス';
var s = '';
var ss = '';
var LibName = 'user32.dll';
var Unicode = 'W';

var stm = new ActiveXObject('ADODB.Stream');
stm.open();
stm.type = 2;//adTypeText
stm.charset = 'shift-jis';
stm.LoadFromFile(FilePath);
var s = stm.readtext();
stm.Close();

//関数名
s.match(/\s(\w+)\(\r\n/);
var funcName = RegExp.$1 + Unicode;
//WScript.Echo(funcName);//確認用

//戻り値の可否
if(/void/i.test(s))
	ss= 'Declare Sub ' + funcName + ' Lib \"' + LibName + '\" (';
else
	ss= 'Declare Function ' + funcName + '& ' + 'Lib \"' + LibName + '\" (';

//引数
var rng = new RegExp(/\s[\*|\*\*]?(\w+),?\r\n/g);
while(rng.exec(s)!= null ){
	ss+= ' ByVal ' + RegExp.$1 + '&,';
}
ss+= ')';
ss = ss.replace(/,\)/g,'\)');
ss = ss.replace(/[\r\n]/g,'');

//結果
WScript.Echo(ss);
WScript.Quit();

---------------------------
Windows Script Host
---------------------------
Declare Function FindWindowExW& Lib "user32.dll" ( ByVal hwndParent&, ByVal hwndChildAfter&, ByVal lpszClass&, ByVal lpszWindow&)
---------------------------
OK   
---------------------------

 
# 疲れた(・∀・)

回答
投稿日時: 12/01/15 16:18:44
投稿者: YU-TANG
投稿者のウェブサイトに移動

こんにちはー。
面白そうですね。
 
斜め読みして思ったこと。
 

引用:
//戻り値の可否
if(/void/i.test(s))

ここ、
LPVOID
とかにも引っかかりそうな気がします。
 
それでは。

投稿日時: 12/01/16 08:09:50
投稿者: kumatti
投稿者のウェブサイトに移動

・修正
> if(/void/i.test(s))

//戻り値の可否
if(/^void/i.test(s))

> var rng = new RegExp(/\s[\*|\*\*]?(\w+),?\r\n/g);

//引数
var rng = new RegExp(/\s(\*+)?(\w+),?\r\n/g);

>     ss+= ' ByVal ' + RegExp.$1 + '&,';
	ss+= ' ByVal ' + RegExp.$2 + '&,';

YU-TANG さんの引用:

ここ、
LPVOID
とかにも引っかかりそうな気がします。

YU-TANGさん、ありがとうございました。
行頭にマッチ(引数の方にもマッチしてた)を忘れていたので、勘違いさせてしまった様です。失礼しました。
(PVOIDでもLPVOIDでもvoid*でも、戻り値を持つので大丈夫です)

回答
投稿日時: 12/01/16 17:07:22
投稿者: YU-TANG
投稿者のウェブサイトに移動

こんにちは。
 

kumatti さんの引用:
行頭にマッチ(引数の方にもマッチしてた)を忘れていたので、勘違いさせてしまった様です。失礼しました。
(PVOIDでもLPVOIDでもvoid*でも、戻り値を持つので大丈夫です)

 
最初に投稿されている test.txt (DeviceIoControl の定義文)の引数の方にある LPVOID を指したつもりでした。
 
ところで、自分ならどう組むかな、と思って、ちょっとやってみました。
 
 
var filePath = 'test.txtへのパス';
var s = new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(filePath).ReadAll();
var libName = 'user32.dll';
var unicode = 'W';

//WScript.Echo(s);//確認用

// 戻り値の可否
var head = 'Declare ' 
         + (/^void winapi /i.test(s) ? 'Sub $1' + unicode : 'Function $1' + unicode + '&') 
         + ' Lib "' + libName + '" ';

// 関数名
s = s.replace(/^.*\b(\w+)(?=\()/, head);

// 引数
s = s.replace(/^.*\b(\w+)(,?)$/gm, 'ByVal $1&$2');

// 整形
s = s.replace(/\r\n/g, " ");  // 改行コードを削除
s = s.slice(0,-1);            // 末尾の ; を削除

// 結果
WScript.Echo(s);
WScript.Quit();

 
なるほど。
自分は replace 脳ということが分かりました。w

投稿日時: 12/01/18 10:01:22
投稿者: kumatti
投稿者のウェブサイトに移動

YU-TANGさん、ありがとうございます。
必要な部分を取り出すのではなくて、残すアプローチと言うか、その発想は出なかったです(難易度も高いし)。
上級者の方が書くと、かくも違うものかと非常に参考になります。
 
---
私のコードで改行を削除が要らなかったのと、関数名に間接演算子が、付いているケースを想定していませんでした。
> s.match(/\s(\w+)\(\r\n/);
> var funcName = RegExp.$1 + Unicode;

s.match(/\s(\*+)?(\w+)\(\r\n/g);
var funcName = RegExp.$2 + Unicode;

> ss = ss.replace(/,\)/g,'\)');
削除。

投稿日時: 12/01/25 10:16:56
投稿者: kumatti
投稿者のウェブサイトに移動

・構造体のVBA用、変換
 
※ 共用体は自前で指定。
TASKDIALOGCONFIG structure
http://msdn.microsoft.com/en-us/library/windows/desktop/bb787473%28v=vs.85%29.aspx
 
test1.txt

typedef struct _TASKDIALOGCONFIG {
  UINT                           cbSize;
  HWND                           hwndParent;
  HINSTANCE                      hInstance;
  TASKDIALOG_FLAGS               dwFlags;
  TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons;
  PCWSTR                         pszWindowTitle;
  union {
    HICON  hMainIcon;
    PCWSTR pszMainIcon;
  };
  PCWSTR                         pszMainInstruction;
  PCWSTR                         pszContent;
  UINT                           cButtons;
  const TASKDIALOG_BUTTON        *pButtons;
  int                            nDefaultButton;
  UINT                           cRadioButtons;
  const TASKDIALOG_BUTTON        *pRadioButtons;
  int                            nDefaultRadioButton;
  PCWSTR                         pszVerificationText;
  PCWSTR                         pszExpandedInformation;
  PCWSTR                         pszExpandedControlText;
  PCWSTR                         pszCollapsedControlText;
  union {
    HICON  hFooterIcon;
    PCWSTR pszFooterIcon;
  };
  PCWSTR                         pszFooter;
  PFTASKDIALOGCALLBACK           pfCallback;
  LONG_PTR                       lpCallbackData;
  UINT                           cxWidth;
} TASKDIALOGCONFIG;

var filePath = 'test1.txtへのパス';
var s = new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(filePath).ReadAll();
//WScript.Echo(s);

// carriage return
s = s.replace(/\r/g,'');
// WScript.Echo(s);

// 構造体タグ名
s = s.replace(/typedef struct _?(\w+) {/g,'Type $1');
// WScript.Echo(s);

// }の置換
s = s.replace(/} \w+;/g,'End Type');

// 型
s = s.replace(/( \w+)? (\w+) /g,'');
// WScript.Echo(s);

// メンバ
s = s.replace(/(\*+)?(\w+);/g,'$2 As Long');
// WScript.Echo(s);

// 結果
WScript.Echo(s);

結果
---------------------------
Windows Script Host
---------------------------
Type TASKDIALOGCONFIG
                           cbSize As Long
                           hwndParent As Long
                      hInstance As Long
               dwFlags As Long
 dwCommonButtons As Long
                         pszWindowTitle As Long
 {
    hMainIcon As Long
   pszMainIcon As Long
  };
                         pszMainInstruction As Long
                         pszContent As Long
                           cButtons As Long
        pButtons As Long
                            nDefaultButton As Long
                           cRadioButtons As Long
        pRadioButtons As Long
                            nDefaultRadioButton As Long
                         pszVerificationText As Long
                         pszExpandedInformation As Long
                         pszExpandedControlText As Long
                         pszCollapsedControlText As Long
 {
    hFooterIcon As Long
   pszFooterIcon As Long
  };
                         pszFooter As Long
           pfCallback As Long
                       lpCallbackData As Long
                           cxWidth As Long
End Type
---------------------------
OK   
---------------------------

 
TaskDialogIndirectは、ちょっとしたUserForm程度の表現力がありますね。
Task Dialogs
http://msdn.microsoft.com/en-us/library/aa511299.aspx

投稿日時: 12/02/17 11:30:31
投稿者: kumatti
投稿者のウェブサイトに移動

> TaskDialogIndirect
IE9では、既にお馴染みですね。
 
コードは、gistに載せました。
https://gist.github.com/kumatti1
 
---
では、閉じます。