ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2018年8月15日(水) 17:39

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 2 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2010年10月24日(日) 23:04 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
ご無沙汰しております。

今回、WindowsのProductIDを取得しようとして、以下のコードを書きました。
[hide]
コード:
MessageBox(0,GetWinProductId(),0,0)

Function GetWinProductId() As String
	Dim path As BytePtr
	Dim p_id As BytePtr
	Dim re As DWordPtr
	Dim os As OSVERSIONINFO
	Dim bErr As Long
	Dim hKey As HKEY

	path=malloc(256)
	p_id=malloc(256)

	os.dwOSVersionInfoSize=Len(os)
	bErr=GetVersionEx(os)
	If bErr=FALSE Then
		MessageBox(0,"OSバージョンの取得に失敗","Error",MB_OK or MB_ICONHAND)
		free(path)
		free(p_id)
		Exit Function
	End If

	If os.dwPlatformId=VER_PLATFORM_WIN32_NT Then
    	path="SOFTWARE\Microsoft\Windows NT\CurrentVersion"
	Else
	    path="SOFTWARE\Microsoft\Windows\CurrentVersion"
	End If

	bErr=RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_READ,hKey)
	If bErr<>0 Then
		Error(bErr,1)
		free(path)
		free(p_id)
		Exit Function
	End If

	re=malloc(256)
	re=256
	bErr=RegQueryValueEx(hKey,"ProductId",&0,REG_SZ,p_id,VarPtr(re))
	If bErr<>0 Then
		Error(bErr,2)
/*		free(re)
		free(path)
		free(p_id)
*/		Exit Function
	End If

	bErr=RegCloseKey(hKey)
	bErr=RegQueryValueEx(hKey,"ProductId",&0,REG_SZ,p_id,re)
	If bErr<>0 Then
		Error(bErr,3)
		free(re)
		free(path)
		free(p_id)
		Exit Function
	End If

	free(re)
	free(path)
	free(p_id)

	GetWinProductId=p_id

End Function


Sub Error(msg As Long,num As Long)
	Dim lpMsgBuf As BytePtr
	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, _
	    NULL, _
	    msg, _
	    LANG_USER_DEFAULT, _
	    VarPtr(lpMsgBuf), _
	    0, _
	    NULL)
	MessageBox(0,lpMsgBuf,"Error msg NUM:"+Str$(num),MB_OK)
	LocalFree(lpMsgBuf)
End Sub
[/hide]

初めてのレジストリの操作でどきどきしながらデバッグコンパイル。

どうやら、
コード:
RegQueryValueEx(hKey,"ProductId",&0,REG_SZ,p_id,re)
ここで、アクセス違反が起きているようです。

しかし、どうしてかが分かりません。

すいませんが、ご存知の方がいらっしゃいましたら、ご教授ください。
お願いします。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2010年10月25日(月) 02:24 
わからないわからないではなくまずポインタの勉強を先にしてリファレンスをよく読む
検索する。Cのサンプルでもあたること。


正解を書いてもよいのだが力にならないのでヒントだけ提示する。

pathにはmallocしてもその後リテラルを代入しているのだから
これはしてはいけないこと、後のfreeで問題になる

変数reはDWord型にしバッファサイズを代入し
RegQueryValueExの第6引数にポインタを渡すこと

RegQueryValueExの大4引数は型が戻ってくるのでありこちらが指定してはいけない


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 2 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke