<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/hisam/">
    <title>hisa @ cs21 etc. wiki</title>
    <link>http://w.atwiki.jp/hisam/</link>
    <atom:link href="https://w.atwiki.jp/hisam/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>hisa @ cs21 etc. wiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2012-09-04T12:02:22+09:00</dc:date>
    <utime>1346727742</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/38.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/51.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/20.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/25.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/47.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/50.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/11.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/29.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/23.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/hisam/pages/32.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/38.html">
    <title>私用ブックマーク</title>
    <link>https://w.atwiki.jp/hisam/pages/38.html</link>
    <description>
      なにもありません    </description>
    <dc:date>2012-09-04T12:02:22+09:00</dc:date>
    <utime>1346727742</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/51.html">
    <title>VB.NETからVC++とかのUnmanagedDLLを使う</title>
    <link>https://w.atwiki.jp/hisam/pages/51.html</link>
    <description>
      &amp;bold(){VB.NET からVC++とかのUnmanagedDLLを使うやりかた}

&amp;bold(){○前提}
&amp;bold(){使われる側：}
　VC++などで作成されたアンマネージコードDLL
　作成方法はここでは言及しない
&amp;bold(){使う側：}
　[[VB.NET]]（たぶん全バージョン）
　＃検証にはVB2008、.NET Framework2.0を使用しました

&amp;bold(){○前提知識}
&amp;bold(){VB6からVC++DLLを呼ぶ方法：}
　Declare Function 関数名 Lib ファイル名 (引数) As 返却値型
　＃VB.NETでも同様の書き方が出来るため（以下の説明でも使用）
　　VB.NETから使える書き方もある（ここでは言及しない）
&amp;bold(){ネイティブコード：}
　CPUが解釈できるマシン語バイナリのコード。
　ネイティブコードで出来たアプリケーションは
　ネイティブアプリケーション。
　WindowsネイティブアプリケーションはWindowsOS上で
　（必要なライブラリがあれば）動作する。

&amp;bold(){[[マネージコード&gt;http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%BC%E3%83%89]]：}
　CLR（≒.NET Framework）上で 動くコード。
　WindowsOSだけでなく（対応するバージョンの）.NET Frameworkを
　インストールしてなければ動作しない。
　　厳密には：
　　　CLI：仕様
　　　CLR：CLIのMicrosoftによる実装
　　　CIL：CLRが解釈するコード
　　　VES：CLI仮想マシン。CILをネイティブコードに翻訳して実行する

&amp;bold(){マネージメモリ：}
　マネージコードで通常管理されるメモリ領域。
　つまりVES仮想マシン上におけるメモリ。
　※要注意：
　　　マネージメモリはアンマネージコードに渡してはならない。
　　　もしテストで正常に動いたとしてもそれはあくまで偶然であり、
　　　常に正常に動くとは限らない。
　　　↑マネージメモリ空間内でデータは勝手に移動されることがあるため

&amp;bold(){アンマネージコード：}
　CLR上で 動くコード以外（≒ネイティブコード）。
&amp;bold(){アンマネージメモリ：}
　アンマネージドコードで使われるメモリ領域。
　つまりOS上におけるメモリ。

&amp;bold(){マーシャリング}
　マネージコードとアンマネージコードの橋渡しをすること。
　アンマネージコード間では単にインターフェースが相当するが、
　マネージコードではインターフェースを解釈・仲介するために
　さらにマーシャリングが必要になる。
　↑メモリ空間が異なるため
&amp;bold(){マーシャラ}
　マーシャリングするもの。VB.NETでは
　System.Runtime.InteropServices.Marshalクラス

&amp;bold(){○マネージメモリとアンマネージメモリ}
-アンマネージドコード側
--すべてアンマネージメモリ
-アンマネージドコードとマネージドコードのインターフェイス
--すべてアンマネージメモリ
--ただし標準的な数値型は自動的にマーシャリングされる
-マネージドコード側
--コードで扱えるのはマネージドメモリのみ
--ポインタで受け渡されたインターフェース（文字列、構造体等含む）は自前でマーシャリングして、マネージドメモリにコピーしてから使う。
--またポインタを渡す場合も自前でマーシャリングする

&amp;bold(){○方法}(inとoutはDLL側から見た場合で記載）
以下の例は[[Shapefile C Library V1.2&gt;http://shapelib.maptools.org/]]を
アンマネージDLL使用例としています。
APIは[[ここ&gt;http://shapelib.maptools.org/shp_api.html]]参照

&amp;bold(){数値型の場合：}
①渡す値(in)
DLL側のインターフェースがdouble、int、long、bool等の
数値型の場合、渡す値(in)はByValとする。

②受け取る値のシングルポインタ(out)と
　受け渡し両方の値のシングルポインタ(in/out)
DLL側のインターフェースがdouble＊、int＊、long＊、bool＊等の
数値型のポインタの場合、値はByRefにするだけとする。
（ポインタという意識はしない＝ByRef自体がポインタだから）

①②双方とも、自動的にマーシャリングされるので
VB6との相違は意識しなくともよい。
（＝昔のVBからDLLを使う意識で問題なし）
利用例は以下例２参照

&amp;bold(){文字列型の場合：}
①渡す文字列(in)
DLL側のインターフェースがconst char＊、LPCSTR等の
文字列ポインタで引渡し文字列を渡す(in)場合、
値型と同様にByValで問題なし。
ただし自動マーシャリングによりinなのに変数内の値が
変わっていることがある。
そのような場合はラッパークラスを作って、呼び出しを
内部的に二重化すると解決できる。

例１（ラッパー）：
    Public Module Module1
        ・ラッパークラス
        Public Class cSHPWrapper
            ・ラッパーメソッド
            Public Shared Function SHPOpen(ByVal stShapeFile As String, ByVal stAccess As String) As IntPtr
                Return Module1.SHPOpen(stShapeFile, stAccess)
            End Function
        End Class
    
        ・VB.NET側宣言
        Public Declare Function SHPOpen Lib &quot;shapelib.dll&quot; (ByVal pszShapeFile As String, ByVal pszAccess As String) As IntPtr
    
        ・コード
        Dim hSHP As IntPtr = cSHPWrapper.SHPOpen(fname, &quot;rb&quot;)
    
    End Module

②受け取る文字列(out)と
　受け渡し両方の文字列(in/out)
DLL側のインターフェースがchar＊、LPSTR等の
文字列ポインタで文字列を受け取る(out)場合、
または文字列を受け渡し両方する(in/out)場合、
文字列はStringBuilder型にして、ByValで受け渡す。
StringBuilderはVB側では固定長文字列(NULL終端)のような認識の
使い方（VC++DLL側から見ればLPTSTR≒char＊そのもの）
Stringにするには.ToStringすればいいだけ。
例２（数値の例／文字列受け取りの例）：
    ・DLL側I/F
    DBFFieldType DBFGetFieldInfo( DBFHandle hDBF, int iField, char * pszFieldName,
                                int * pnWidth, int * pnDecimals );

    ・VB.NET側宣言
    Public Declare Function DBFGetFieldInfo Lib ”shapelib.dll” (ByVal hDBF As IntPtr, _　’inハンドル
                                ByVal iField As Integer, _　’in数値
                                ByVal pszFieldName As StringBuilder, _　’out文字列
                                ByRef pnWidth As Integer, ByRef pnDecimals As Integer)  _　’out数値シングルポインタ
                                As Integer
    ・コード
    Dim stbFieldName As New StringBuilder(12)
    Dim iWidth As Integer,iDecimals As Integer,stName As String
    iDataType = DBFGetFieldInfo(hDBF, i, stbFieldName, iWidth, iDecimals)
    stName = stbFieldName.ToString

&amp;bold(){構造体やポインタ、配列の場合：}（値のシングルポインタ除く）
型はIntPtr型にする。
①渡す(in)場合
ポインタの示すメモリはマネージコード側で確保する必要がある。
もちろん使い終わったら開放する必要も生じる。
確保はMarshal.AllocHGlobal、開放はMarshal.FreeHGlobal。
マネージメモリをアンマネージメモリにコピーするには
数値型・ポインタの場合Marshal.Copy。
文字列はMarshal.PtrToString＊とMarshal.String＊ToPtr。
アンマネージメモリのメモリリークに要注意。確保したら開放する。
例３（構造体・ポインタ・配列の例）：
    ・DLL側I/F
    SHPObject* 
        SHPCreateSimpleObject( int nSHPType, int nVertices, 
                            double* padfX, double* padfY,
                            double* padfZ, );
    ＃ここのdouble*はdouble配列のポインタ

    ・VB.NET側宣言
    Public Declare Function SHPCreateSimpleObject Lib &quot;shapelib.dll&quot; (ByVal nSHPType As Integer, ByVal nVertices As Integer, _
                                           ByVal padfX As IntPtr, ByVal padfY As IntPtr, ByVal padfZ As IntPtr) As IntPtr
    
    ・コード
        Dim padfX() As Double = = {139.01, 140.11111111, 138.222222}　&#039;←マネージメモリ
        Dim size As Integer = Marshal.SizeOf(padfX(0)) * padfX.Length
        Dim ptrX As IntPtr = Marshal.AllocHGlobal(size)　&#039;←アンマネージメモリ確保
        Marshal.Copy(padfX, 0, ptrX, padfX.Length)　&#039;←マネージメモリをアンマネージメモリにコピー
        &#039;ptrYの処理については同様のため略
        Dim SHPObj As IntPtr = SHPCreateSimpleObject(3, padfX.Length, ptrX, ptrY, 0)　&#039;←DLLコール
        If SHPObj = IntPtr.Zero Then Return -1
        SHPDestroyObject(SHPObj)　&#039;←DLLが確保したものは基本DLLに開放させる
        Marshal.FreeHGlobal(ptrX)　&#039;←アンマネージメモリ確保

構造体の場合Marshal.PtrToStructureとMarshal.StructureToPtrで
データをコピーするが、その際、構造体の宣言に注意。
LayoutKindで構造体内のメモリレイアウトを事前に宣言する
必要がある。
構造体はStructureでもClassでも可能だが、宣言等違いに注意。
以下例４参照。

②受け取る(out)場合と
　受け渡し両方(in/out)の場合
受け取る(out)場合も基本的には同じ。上の例のSHPObj参照。
ただしアンマネージメモリの値を取り出す場合は、逆に
マネージメモリにコピーしてから利用する必要がある。
例４（構造体・ポインタ・配列の受け取り例／構造体の場合の注意点）：
    ・VB.NET側宣言
    　（方法１）
    &lt;StructLayout(LayoutKind.Sequential)&gt; _
    Public Structure SHPObject
        Public nSHPType As Integer
        Public nShapeId As Integer
        Public panPartStart As IntPtr
    End Structure
    　（方法２　より厳密な方法　以下では使用しない）
    &lt;StructLayout(LayoutKind.Explicit)&gt; _
    Public Class SHPObject
        &lt;FieldOffset(4)&gt; Public nSHPType As UInt32
        &lt;FieldOffset(4)&gt; Public nShapeId As UInt32
        &lt;FieldOffset(4)&gt; Public panPartStart As UInt32
    End Class 
    
    ・コード
        Public Shared Function SHPReadObject(ByVal hSHP As IntPtr, ByVal iShape As Integer, ByRef oSHP_SO As SHPSimpleObject) As Boolean
    
            Dim poSHP As IntPtr
    
            Try
                poSHP = Module1.SHPReadObject(hSHP, iShape)
                &#039;返却値構造体ポインタがNULLなら異常終了
                If IntPtr.Zero.Equals(poSHP) Then Return False
                &#039;返却値構造体ポインタから、アンマネージ構造体をマネージ構造体へコピー
                Dim oSHP As SHPObject = Marshal.PtrToStructure(poSHP, GetType(SHPObject))
                With oSHP_SO
                    .nSHPType = oSHP.nSHPType
                    .nShapeId = oSHP.nShapeId
                    .nVertices = oSHP.nVertices
                    .tZ.iLimit = .nVertices - 1
                End With
                &#039;返却値構造体ポインタから、ポインタ格納されているアンマネージ配列をマネージ構造体へコピー
                With oSHP_SO.tZ
                    ReDim .x(.iLimit)
                    ReDim .y(.iLimit)
                    Marshal.Copy(oSHP.padfX, .x, 0, .iLimit + 1)
                    Marshal.Copy(oSHP.padfY, .y, 0, .iLimit + 1)
                End With
            Catch
                Return False
            Finally
                &#039;返却値構造体ポインタを開放
                If IntPtr.Zero.Equals(poSHP) = False Then SHPDestroyObject(poSHP)
            End Try
    
            Return True
    
        End Function




[[もどる&gt;いろんな情報たち　-　技術]]    </description>
    <dc:date>2010-05-31T10:22:24+09:00</dc:date>
    <utime>1275268944</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/20.html">
    <title>VB.NET</title>
    <link>https://w.atwiki.jp/hisam/pages/20.html</link>
    <description>
      -[[画像を拡大・縮小する&gt;http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample141ImageMagnify.htm]]
-[[VB.NETからVC++とかのUnmanagedDLLを使う]]





[[もどる&gt;いろんな情報たち　-　技術]]    </description>
    <dc:date>2010-05-24T09:48:08+09:00</dc:date>
    <utime>1274662088</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/25.html">
    <title>PHP</title>
    <link>https://w.atwiki.jp/hisam/pages/25.html</link>
    <description>
      &amp;bold(){ナレッジベース}
-[[PHP-Windows]]
-[[なぜSuhosinを使うのか&gt;http://d.hatena.ne.jp/hnw/20090101]]
--SuhosinはPHPのセキュリティパッチ（コアに取り込まれていない）
--内部サーバならほぼ不要
--外部公開サーバならSuhosinを使うべき

----
&amp;bold(){参考ページ}
-[[レッツPHP&gt;http://php.s3.to/tt/index.php]]
-[[PHP マニュアル&gt;http://www.php.net/manual/ja/]]






[[もどる&gt;いろんな情報たち　-　技術]]    </description>
    <dc:date>2010-04-09T21:35:57+09:00</dc:date>
    <utime>1270816557</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/47.html">
    <title>PHP-Windows</title>
    <link>https://w.atwiki.jp/hisam/pages/47.html</link>
    <description>
      -[[PHP-WindowsXP／2003-x64]]

-&amp;bold(){[[使われるphp.iniのパス&gt;http://php.net/manual/ja/configuration.file.php]]}
--レジストリ、環境変数PHPRCに注意
--Windows ディレクトリ (C:\windows  もしくは C:\winnt)) に格納するのはあまり薦められたものではない

-&amp;bold(){インストーラのWebServerSetup(IIS ISAPI)について}
--IIS ISAPIインストールオプションがあるのは5.2.9-1まで
---5.2.9-2以降はインストーラでIIS ISAPIがサポートされない。
---以後ではIIS FastCGIを使うべきであるらしい
---最新版ではもうphp5isapi.dllが含まれていない
---IISのFastCGIはhttp://www.iis.net/などから入手可能

-&amp;bold(){64bit WindowsOSでphp5isapi.dll等を利用する場合、%SYSTEMROOT%system32に格納してはいけない}
--古いPHP(onIIS)インストール時にphp5isapi.dll等を%SYSTEMROOT%system32にコピーする方法はたしかに簡単ではある（デフォルトのdllの検索パスだから）
--ただし64bit WindowsOSの場合は、上記を行っても動作しない
--対象：
---Windows XP/VISTA/7 x64 Edition
---Windows Server 2003/2003 R2 x64 Edition
---Windows Server 2008/2008 R2 x64 Edition
--理由：
---64bitWindowsでは%SYSTEMROOT%system32には64bitのものを格納し、同一のものの32bit版を%SYSTEMROOT%SysWOW64に格納する決まりになっている。[[参考&gt;http://www.itmedia.co.jp/enterprise/articles/0506/21/news002_2.html]]



[[もどる&gt;いろんな情報たち　-　技術]]    </description>
    <dc:date>2010-04-09T21:34:13+09:00</dc:date>
    <utime>1270816453</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/50.html">
    <title>PHP-WindowsXP／2003-x64</title>
    <link>https://w.atwiki.jp/hisam/pages/50.html</link>
    <description>
      -&amp;bold(){64bit WindowsXP/2003のIIS6.0でphp5isapi.dll等を利用する場合、ワーカープロセスを32bitに強制しなくてはならない}
--対象：
---Windows XP x64 Edition
---Windows Server 2003/2003 R2 x64 Edition
--理由：
---64bit WindowsXP/2003のIIS6.0は、デフォルトで64bit版がインストールされる
---64bit版IIS6.0はワーカープロセスをデフォルトでは64bitで起動する
---PHP.netで配布されているコンパイル済みのPHPは32bitである
---64bitワーカープロセスが32bitのPHPのDLLを利用しようとしてエラーになる
--解決方法：
---Ａ：PHPのDLLを自前で64bitコンパイルする←かなり非現実的
---Ｂ：ワーカープロセスを32bitで起動することを強制する設定を行う
----設定方法：cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
----注意：IIS6.0から起動されるワーカープロセスはすべて32bitになる。他のISAPIフィルタ(ASP.NET等）がインストールしてある場合、64bitのものは動作しなくなるため注意すること
----[[参考１&gt;http://support.microsoft.com/?kbid=895976]]　[[参考２&gt;http://support.microsoft.com/kb/894435/ja]]
--付記：
---64bit WindowsVISTA/2008/7はIIS7.0以上で、ISAPIフィルタ別にワーカープロセスを64bit/32bit起動するか設定が可能なため、この問題はない
---PerlはISAPIフィルタではなくCGIのため、この問題はない。PHPもISAPIではなくPHP-CGI.exeで動作させるのならば、この問題はない。FastCGIは64bitOSの場合、64bit版もインストールされるため、この問題はない。


[[もどる&gt;いろんな情報たち　-　技術]]    </description>
    <dc:date>2010-04-09T21:32:41+09:00</dc:date>
    <utime>1270816361</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/11.html">
    <title>いろんな情報たち</title>
    <link>https://w.atwiki.jp/hisam/pages/11.html</link>
    <description>
      いろんな情報たち

-[[経営&gt;いろんな情報たち　-　経営]]
-[[管理&gt;いろんな情報たち　-　管理]]
-[[人材関連&gt;いろんな情報たち　-　人材関連]]
-[[技術&gt;いろんな情報たち　-　技術]]
-[[人格&gt;いろんな情報たち　-　人格]]
----
-[[よく見るサイト&gt;いろんな情報たち　-　よく見るサイト]]
-[[注目情報&gt;いろんな情報たち　-　注目情報]]


-[[もどる&gt;トップページ]]
----

&amp;font(red){&amp;bold(){[ スポンサード リンク ]}}
&amp;font(red){&amp;bold(){は押さないようにしよう。}}
&amp;font(red){&amp;bold(){押すのは自己責任で。 }}    </description>
    <dc:date>2010-04-09T09:14:28+09:00</dc:date>
    <utime>1270772068</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/29.html">
    <title>役に立ちそうなツール</title>
    <link>https://w.atwiki.jp/hisam/pages/29.html</link>
    <description>
      -&amp;bold(){ハードディスク消去ツール}
--[[「wipe-out」&gt;http://www.wheel.gr.jp/~dai/software/wipe-out/]]

-&amp;bold(){バックアップソフト}
--[[「Macrium Reflect」&gt;http://www.macrium.com/]]
---Free Editionは非商用フリー（商用は$39.99）
---RecoveryCD作成可能
---SystemDriveバックアップ可能(RecoveryCD必須）
---バックアップファイルをマウント可能
---[[紹介ページ１&gt;http://itpro.nikkeibp.co.jp/article/COLUMN/20090716/333982/?ST=vista]]　[[紹介ページ２&gt;http://gigazine.net/index.php?/news/comments/20090206_macrium_reflect_free_edition/]]


[[もどる&gt;トップページ]]
----
&amp;font(red){&amp;bold(){[ スポンサード リンク ]}}
&amp;font(red){&amp;bold(){は押さないようにしよう。}}
&amp;font(red){&amp;bold(){押すのは自己責任で。}}    </description>
    <dc:date>2010-04-09T09:14:00+09:00</dc:date>
    <utime>1270772040</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/23.html">
    <title>いろんな情報たち　-　人格</title>
    <link>https://w.atwiki.jp/hisam/pages/23.html</link>
    <description>
      -[[本当のことを言う&gt;http://itpro.nikkeibp.co.jp/article/COLUMN/20090212/324601/]]

*健康・メンタルヘルス
-[[ディスプレイを“正しく”使えば疲労は減る――ナナオの疲れ目対策とは？&gt;http://plusd.itmedia.co.jp/pcuser/articles/0807/04/news015.html]]

-[[ITMedia Biz.ID 心の健康まとめ&gt;http://www.itmedia.co.jp/bizid/kokoro_index.html]]

-[[若者に急増する“新型うつ”の事実&gt;http://bizmakoto.jp/makoto/articles/0806/26/news027.html]]

*社員旅行
-[[改正道路交通法（後部座席シートベルト着用義務化）&gt;http://headlines.yahoo.co.jp/hl?a=20080608-00000034-san-l08]]
　　バス内での「今年の～」発表も今後は着席で？
----
○[[不祥事&gt;いろんな情報たち　-　不祥事]]



[[もどる&gt;いろんな情報たち]]

----
&amp;font(red){&amp;bold(){[ スポンサード リンク ]}}
&amp;font(red){&amp;bold(){は押さないようにしよう。}}
&amp;font(red){&amp;bold(){押すのは自己責任で。}}    </description>
    <dc:date>2009-02-25T10:49:54+09:00</dc:date>
    <utime>1235526594</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/hisam/pages/32.html">
    <title>ちょっとしたテク？</title>
    <link>https://w.atwiki.jp/hisam/pages/32.html</link>
    <description>
      ----
&amp;font(red){&amp;bold(){[ スポンサード リンク ]}}
&amp;font(red){&amp;bold(){は押さないようにしよう。}}
&amp;font(red){&amp;bold(){押すのは自己責任で。}}    </description>
    <dc:date>2008-09-25T11:14:36+09:00</dc:date>
    <utime>1222308876</utime>
  </item>
  </rdf:RDF>
