ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年9月25日(月) 15:06

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 2 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2007年12月18日(火) 00:32 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
住所: 兵庫県
ノーマルウィンドウベースのプロジェクトにおいて、

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
の位置に次のようなコードを入力します。
コード:
Type IDispatchVtbl
	'IUnknown
	QueryInterface As VoidPtr
	AddRef As VoidPtr
	Release As VoidPtr
	'IDispatch
	GetTypeInfoCount As VoidPtr
	GetTypeInfo As VoidPtr
	GetIDsOfNames As VoidPtr
	Invoke As VoidPtr
End Type

Type IDispatch_Internal
	lpVtbl As *IDispatchVtbl
	m_refCnt As DWord

	pSrcUnk As *IUnknown
	dwDocCookie As DWord
End Type

Type IDocHostUIHandlerVtbl
	'IUnknown
	QueryInterface As VoidPtr
	AddRef As VoidPtr
	Release As VoidPtr
	'IDocHostUIHandler
	ShowContextMenu As VoidPtr
	ShowUI As VoidPtr
	GetHostInfo As VoidPtr
	HideUI As VoidPtr
	UpdateUI As VoidPtr
	EnableModeless As VoidPtr
	OnDocWindowActivate As VoidPtr
	OnFrameWindowActivate As VoidPtr
	ResizeBorder As VoidPtr
	TranslateAccelerator As VoidPtr
	GetOptionKeyPath As VoidPtr
	GetDropTarget As VoidPtr
	GetExternal As VoidPtr
	TranslateUrl As VoidPtr
	FilterDataObject As VoidPtr
End Type

Type IDocHostUIHandler_Internal
	lpVtbl As *IDocHostUIHandlerVtbl

	ole_client_site As *IOleClientSite_Internal
	html_window As HWND
End Type

Type IOleClientSiteVtbl
	'IUnknown
	QueryInterface As VoidPtr
	AddRef As VoidPtr
	Release As VoidPtr
	'IOleClientSite
	SaveObject As VoidPtr
	GetMoniker As VoidPtr
	GetContainer As VoidPtr
	ShowObject As VoidPtr
	OnShowWindow As VoidPtr
	RequestNewObjectLayout As VoidPtr
End Type

Type IOleClientSite_Internal
	lpVtbl As *IOleClientSiteVtbl

	in_place As *IOleInPlaceSite_Internal
	doc_host_ui_handler As *IDocHostUIHandler_Internal
	web_browser_events As *IDispatch_Internal '*DWebBrowserEvents2
End Type

Type IOleInPlaceFrameVtbl
	'IUnknown
	QueryInterface As VoidPtr
	AddRef As VoidPtr
	Release As VoidPtr
	'IOleInPlaceFrame
	GetWindow As VoidPtr
	ContextSensitiveHelp As VoidPtr
	GetBorder As VoidPtr
	RequestBorderSpace As VoidPtr
	SetBorderSpace As VoidPtr
	SetActiveObject As VoidPtr
	InsertMenus As VoidPtr
	SetMenu As VoidPtr
	RemoveMenus As VoidPtr
	SetStatusText As VoidPtr
	EnableModeless As VoidPtr
	TranslateAccelerator As VoidPtr
End Type

Type IOleInPlaceFrame_Internal
	lpVtbl As *IOleInPlaceFrameVtbl
End Type

Type IOleInPlaceSiteVtbl
	'IUnknown
	QueryInterface As VoidPtr
	AddRef As VoidPtr
	Release As VoidPtr
	'IOleInPlaceSite
	GetWindow As VoidPtr
	ContextSensitiveHelp As VoidPtr
	CanInPlaceActivate As VoidPtr
	OnInPlaceActivate As VoidPtr
	OnUIActivate As VoidPtr
	GetWindowContext As VoidPtr
	Scroll As VoidPtr
	OnUIDeactivate As VoidPtr
	OnInPlaceDeactivate As VoidPtr
	DiscardUndoState As VoidPtr
	DeactivateAndUndo As VoidPtr
	OnPosRectChange As VoidPtr  
End Type

Type IOleInPlaceSite_Internal
	lpVtbl As *IOleInPlaceFrameVtbl

	ole_client_site As *IOleClientSite_Internal
	ole_in_place_frame As *IOleInPlaceFrame_Internal
	browser_object As VoidPtr
	hwnd As HWND
End Type

Type IStorageVtbl
	'IUnknown
	QueryInterface As VoidPtr
	AddRef As VoidPtr
	Release As VoidPtr
	'IStorage
	CreateStream As VoidPtr
	OpenStream As VoidPtr
	CreateStorage As VoidPtr
	OpenStorage As VoidPtr
	CopyTo As VoidPtr
	MoveElementTo As VoidPtr
	Commit As VoidPtr
	Revert As VoidPtr
	EnumElements As VoidPtr
	DestroyElement As VoidPtr
	RenameElement As VoidPtr
	SetElementTimes As VoidPtr
	SetClass As VoidPtr
	SetStateBits As VoidPtr
	Stat As VoidPtr
End Type

Type IStorage_Internal
	lpVtbl As *IStorageVtbl
End Type

Dim pSink_WebBrowser As *IDispatch_Internal

Dim ole_client_site As *IOleClientSite_Internal
Dim storage As *IStorage_Internal
Dim ole_in_place_site As *IOleInPlaceSite_Internal
Dim ole_in_place_frame As *IOleInPlaceFrame_Internal
Dim doc_host_ui_handler As *IDocHostUIHandler_Internal
Createイベントを次のように追加します。
コード:
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	Debug
	'IDispatch(Sink)
	pSink_WebBrowser=GlobalAlloc(GPTR,SizeOf(IDispatch_Internal))
	'IStorage
	storage = GlobalAlloc(GPTR,SizeOf(IStorage_Internal))
	'IOleInPlaceFrame
	ole_in_place_frame=GlobalAlloc(GPTR,SizeOf(IOleInPlaceFrame_Internal))
	'IOleInPlaceSite
	ole_in_place_site=GlobalAlloc(GPTR,SizeOf(IOleInPlaceSite_Internal))
	'IDocHostUIHandler
	doc_host_ui_handler=GlobalAlloc(GPTR,SizeOf(IDocHostUIHandler_Internal))
	'IOleClientSite
	ole_client_site=GlobalAlloc(GPTR,SizeOf(IOleClientSite_Internal))

	GlobalFree(pSink_WebBrowser)
	GlobalFree(storage)
	GlobalFree(ole_in_place_frame)
	GlobalFree(ole_in_place_site)
	GlobalFree(doc_host_ui_handler)
	GlobalFree(ole_client_site)
	Debug
End Sub
このとき、Debug命令でプログラムの実行が一時停止するので、そこで「実行」をクリックすると、次のDebug行が反転した後、デバッガが強制終了してしまいます。
「実行」をクリックする代わりにステップ実行してもGlobalFree(ole_client_site)あたりで強制終了します。
ステップ実行の途中でデバッガに強制終了されて思うようにデバッグが進みません。調査をお願いします。当方の環境 Windows XP Home SP2、ActiveBasic 4.24です。

※本当はもっと複雑なプログラムで、そこからエラーになる要素を抜き出したものです。

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
 記事の件名: 追加
投稿記事Posted: 2007年12月18日(火) 14:50 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
住所: 兵庫県
不具合の原因らしきものを発見しました。
コード:
Type A
	p As *B
End Type

Type B
	p As *A
End Type

Dim ptr As *A,udt As B
Debug
ptr=malloc(SizeOf(A))
ptr->p=VarPtr(udt)
udt.p=ptr
free(ptr)
Debug
上の例では、ptr->pにBのポインタが、udt.pにAのポインタが入っていますが、このようにするとデバッガは変数の内容を一覧する際に無限ループに陥ってしまい、それで強制終了するものと思われます。

こんなコードって書いてはいけないんですかね…?(^^;;

_________________
[hira]
http://hira.hopto.org/


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

All times are UTC+09:00


オンラインデータ

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


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

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