2018年9月10日月曜日

スピード違反は先頭車両だけ捕まるは嘘!!高速道路で速度違反で止められないためには、

速度違反で警察に捕まらないために

お盆の時期も終わり、車で出かける時期は少なくなってきましたが、仕事でもやはり車を運転するという方は多いのではないでしょうか。また、土日に少しドライブなどで目的地に少しでも早く到着したい!とついついスピードを出したくなりますよね。
これから車を運転するよという方々に向けて、スッピード違反で捕まって「会社に報告しなきゃ」、「せっかくの休みが台無し」とならないための知識を少し提供できればなと思います。
ただし、このブログは速度違反を助長するわけではありませんのでご注意ください。
車は自分に合った速度で安全に運転しましょう。

スピード違反はどうして捕まるのか

まず、道中でスピード違反を取り締まる方法をあげます。
  • オービス(自動速度違反取締装置)
  • 固定式
  • 追尾式速度取締
大きく分けてこの3つで警察は速度違反を取り締まっています。
また、速度違反取締を行う場合には「取り締まりを行っている」という内容の掲示を路線の手前でしなければならないという規定があります。
このこれらに注意すればドライブで捕まる確率も格段に減るのではないでしょうか。

・オービス(自動速度違反取締装置)

はじめにオービスとはカッコ書きの通り、自動で速度違反車を取り締まる装置のことです。その装置の前を通ると自動で速度が測定され、速度違反をしている場合は写真を撮影し、管轄の警察署に写真と速度のデータが送られます。その写真に写っているナンバーと人物から所有者を割り出し、後日、自宅に「〇月✕日までに出頭するように」という内容のはがきが届きあえなく御用となります。(詳細は省略)
このときに、社用車やレンタカーであった場合は車の所有者側にまずはがきが届き、当時の運転者に出頭命令がだされ罰せられてしまいます。

しかし、このオービスに取り締まれるルールが有り、そこにいくつか抜け穴があるのです。
・事前に取り締まりをする掲示をすること
・写真にナンバープレート、顔が写っていること
・ナンバープレートと顔のどちらも鮮明に写っている必要がある
・写真にビニール袋などが写ってはならない
などです。
ここで注目してほしいのは3項目の”鮮明に写っている必要がある”という部分です。
裏をかえせばナンバーまたは顔がぶれていた場合取り締まれないのです。
「オービスを光らせたがはがきが来なかった」という話をよく聞きますが、実はこの部分が大きく関係しています。よく言われる、「フィルム切れ」ということはなく、フィルム切れの場合はオービスが光ることすらありません。
出頭した時に事実確認で写真を見せられるのですが、このときに鮮明に写っていないと言い逃れされてしまうため、ぶれている写真では検挙できないそうです。
また、ブレる写真というのは秘密があって、早すぎる車を撮影した際はブレてしまうことが多いそうです。オービスのシャッタースピードは1/1000秒~1/1200秒で夜間で200km/h以上出てれば撮られても検挙されないかもしれません。

また、有名な話ですが、オービスは測定する速度の下限があり、制限速度のだいたい30km/h超過まではオービスが反応しません。反応するのはほとんど40km/h超過から上の速度を出している車が撮影されます。
そうなるとオービスに撮影された場合は一発免許没収になっていしまうので、オービスの近くを通る際には気をつけましょう。



先頭車両だけ捕まるは嘘だった。

このブログに来た方なら多分一番気になるポイントではないでしょうか。よく「スピード違反で捕まるのは先頭車両だけ」というのを聞きますよね。しかしそれを鵜呑みにして「速度出てるけど先頭じゃないから大丈夫!」と走っていると痛い目に合うかもしれません。
では、本当は何なのかって話ですよね。

確かに先頭車両は捕まる確率は高いです。
固定式速度取締の場合は速度を測定し始めてから最初に速度違反をした車が止められます。しかし、その後も連続で速い車が来た場合、駐車スペースに余裕があれば次の車も止められてしまうのです。
また追尾式だと後続車両のほうが捕まる確率が高くなってしまいます。速度の早い車列が覆面パトカーの横を追い越したとします。そこで覆面パトカーはわざわざその車列の先頭の後ろに無理に割り込もうとはせず、余裕を持って車列の最後尾に付き、速度を測定し、測定された後続車を捕まえることになるます。
もっというと、オービスは先頭・後続かかわらず一定の速度を超えている車が連続で来ようとバシバシ写真を撮ってしまいます。

ですので、もし車列で周りの車が早い場合は、みんなに抜かしてもらうか、先頭・最後尾は避けて運転すると良いかもしれません。




2018年6月9日土曜日

LWJGL3で3Dゲーム開発のすすめ日記(2)

2.ゲームループ(説明)

前回かき逃げしたコードについてちょっとだけ説明しようかなぁーって思います
ちょっとだけ...
全体のコードは前回記事のゲームループ1に載せてありますのでご参照ください

分かる範囲で自分なりの理解を書いていくので間違っててもご了承願います.
ではプログラムの実行順でいきますのでファイルが前後左右するとおもいます.


とりあえずmain.javaから
public class Main {
 
    public static void main(String[] args) {
        try {
            boolean vSync = true;
            IGameLogic gameLogic = new DummyGame();
            GameEngine gameEng = new GameEngine("GAME", 600, 480, vSync, gameLogic);
            gameEng.start();
        } catch (Exception excp) {
            excp.printStackTrace();
            System.exit(-1);
        }
    }
}

javaでのmainは最初に実行されるところですね.
ここではまず
"boolean vSync = true;"というのがあります.
このコードは画面の描画で垂直同期をどうするかという変数です.

次に,
IGameLogic gameLogic = new DummyGame();
ですが,ここにでてくるDummyGame()をたどると次は
Dummy.java
public DummyGame() {
        renderer = new Renderer();
}
といううのが出てきます.
また"Renderer()"を追うと,
Renderer.java
public class Renderer {
 
    public Renderer() {        
    }
     
    public void init() throws Exception {        
    }
 
    public void clear() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
}
となりなにも書かれていないので,ここまで書いといてなんですがmainの
IGameLogic gameLogic = new DummyGame();
は今の所無視でいいと思います.

mainにもどり,
GameEngine gameEng = new GameEngine("GAME", 600, 480, vSync, gameLogic);
です
これお追うと,GameEngine.javaにいきますね
public GameEngine(String windowTitle, int width, int height, boolean vSync, IGameLogic gameLogic) throws Exception {
        gameLoopThread = new Thread(this, "GAME_LOOP_THREAD");
        window = new Window(windowTitle, width, height, vSync);
        this.gameLogic = gameLogic;
        timer = new Timer();
}

public void start() {
        String osName = System.getProperty("os.name");
        if ( osName.contains("Mac") ) {
            gameLoopThread.run();
        } else {
            gameLoopThread.start();
        }
 }
ここから徐々にゲームっぽい動きをしていきます.
gameLoopThread = new Thread(this, "GAME_LOOP_THREAD");
最初の行でスレッドを作成します.
スレッドとは簡単に言うとプログラムの並行処理です.
通常のプログラムは書かれた順に上から下に実行するところ,
スレッドを使うことによりゲーム(座標など)の処理と描画処理を同時進行で処理してくれます.


次は
window = new Window(windowTitle, width, height, vSync);
ここではmainから渡された引数を基に()内のウィンドウを作成します
windowTitlie : ウィンドウにのタイトル
width : 画面幅
hight :画面の高さ
vSync : 垂直同期の有無

timer = new Timer();
次はタイマーです
Timer.javaを呼び起こします
package org.lwjglb.engine;
 
public class Timer {
 
    private double lastLoopTime;
     
    public void init() {
        lastLoopTime = getTime();
    }
 
    public double getTime() {
        return System.nanoTime() / 1000_000_000.0;
    }
 
    public float getElapsedTime() {
        double time = getTime();
        float elapsedTime = (float) (time - lastLoopTime);
        lastLoopTime = time;
        return elapsedTime;
    }
 
    public double getLastLoopTime() {
        return lastLoopTime;
    }
}
Timerでフレームレートの計算を行います.

main.javaに戻って
ameEng.start();
これでGmeEngin.javaのstart()クラスを起動します
public void start() {
        String osName = System.getProperty("os.name");
        if ( osName.contains("Mac") ) {
            gameLoopThread.run();
            System.out.println( osName);

        } else {
            gameLoopThread.start();
            System.out.println( osName);
            System.out.println("To Start");
        }
    }
ここの処理でクライアントのOSを判断し,OSごとに違う動作をさせます.
Macで動かす場合はRetinaディスプレイを使用しているためドットbyドット
とはいかず座標関係の計算がWindowsとは異なってきます.
今回の環境はwindowsなのでelse側の処理が行われます.
gameLoopThread.start();
でGmeEngin.javaのpublic void run()クラスが起動します.
@Override
    public void run() {
        try {
            init();
            gameLoop();
        } catch (Exception excp) {
            excp.printStackTrace();
        }
    }
ここが並行処理されるクラスです.

init();でwindow,timer,gameLogicの初期化(initialize)が行われます.
protected void init() throws Exception {
        window.init();
        timer.init();
        gameLogic.init();
    }

gameloop();がゲームの動きそのものです
protected void gameLoop() {
        float elapsedTime;
        float accumulator = 0f;
        float interval = 1f / TARGET_UPS;
 
        boolean running = true;
        while (running && !window.windowShouldClose()) {
            elapsedTime = timer.getElapsedTime();
            accumulator += elapsedTime;
 
            input();
 
            while (accumulator >= interval) {
                update(interval);
                accumulator -= interval;
            }
 
            render();
 
            if (!window.isvSync()) {
                sync();
            }
        }
    }

ここでキーボード入力の監視,画面の描画の処理が行われています.


大雑把にコードの流れは以上です.
次は3D空間の描画について書きたいと思います.






2018年5月25日金曜日

LWJGL3で3Dゲーム開発のすすめ日記(1)

1.ゲームループ


やっと前に進む兆しが見えてきました
いままで記事を探しては脳内トレーニングをしては一旦休んで
ってのを繰り返してきてはや1年が経過
時間を無駄にした気がする...

てな感じでついにとっつきにくい英字のチュートリアルを
進化したgoogle先生に翻訳してもらいながら読み進んでくことに決めました.

lwjglの環境構築で手こずっている方はうちのページでもやり方紹介してるので
参考にしていただけると幸いです。
eclipseによるLWJGL3のわかりやすい導入方法の備忘録


多分一番いい記事なのでココを参考に進めていこうという所存です.
https://ahbejarano.gitbook.io/lwjglgamedev/



とりあえずちょっと知識がある人ならIntroductionは読み飛ばして次の
GameLoopから読んじゃっていいと思います.
英字だったので説明は後々気が乗れば付け加えていきたいと思います
今回は拾ってきたコードだけ貼って逃げます.

ちなみにコードのライセンスはApache Apache v2.0が適応されています
まずはメインプログラムmain.java
package org.lwjglb.game;

import org.lwjglb.engine.GameEngine;
import org.lwjglb.engine.IGameLogic;

public class Main {

    public static void main(String[] args) {
        try {
            boolean vSync = true;
            IGameLogic gameLogic = new DummyGame();
            GameEngine gameEng = new GameEngine("GAME", 600, 480, vSync, gameLogic);
            gameEng.start();
        } catch (Exception excp) {
            excp.printStackTrace();
            System.exit(-1);
        }
    }
}

次はゲームの動きを決めるところDummyGame.java
改造するならこのコードですね
package org.lwjglb.game;

import static org.lwjgl.glfw.GLFW.GLFW_KEY_DOWN;
import static org.lwjgl.glfw.GLFW.GLFW_KEY_UP;
import static org.lwjgl.opengl.GL11.glViewport;
import org.lwjglb.engine.IGameLogic;
import org.lwjglb.engine.Window;

public class DummyGame implements IGameLogic {

    private int direction = 0;
    
    private float color = 0.0f;

    private final Renderer renderer;
    
    public DummyGame() {
        renderer = new Renderer();
    }
    
    @Override
    public void init() throws Exception {
        renderer.init();
    }
    
    @Override
    public void input(Window window) {
        if ( window.isKeyPressed(GLFW_KEY_UP) ) {
            direction = 1;
        } else if ( window.isKeyPressed(GLFW_KEY_DOWN) ) {
            direction = -1;
        } else {
            direction = 0;
        }
    }

    @Override
    public void update(float interval) {
        color += direction * 0.01f;
        if (color > 1) {
            color = 1.0f;
        } else if ( color < 0 ) {
            color = 0.0f;
        }
    }

    @Override
    public void render(Window window) {
        if ( window.isResized() ) {
            glViewport(0, 0, window.getWidth(), window.getHeight());
            window.setResized(false);
        }

        window.setClearColor(color, color, color, 0.0f);
        renderer.clear();
    }
}


レンダリングを制御するとこRenderer.java
package org.lwjglb.game;

import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.glClear;

public class Renderer {

    public Renderer() {        
    }
    
    public void init() throws Exception {        
    }

    public void clear() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
}


ココまでの3つは同じフォルダに入れときます.

ここからはゲームを動作させるのに必要なプログラムです
いじることはないと思います.
GameEngine.java
package org.lwjglb.engine;

public class GameEngine implements Runnable {

    public static final int TARGET_FPS = 75;

    public static final int TARGET_UPS = 30;

    private final Window window;

    private final Thread gameLoopThread;

    private final Timer timer;

    private final IGameLogic gameLogic;

    public GameEngine(String windowTitle, int width, int height, boolean vSync, IGameLogic gameLogic) throws Exception {
        gameLoopThread = new Thread(this, "GAME_LOOP_THREAD");
        window = new Window(windowTitle, width, height, vSync);
        this.gameLogic = gameLogic;
        timer = new Timer();
    }

    public void start() {
        String osName = System.getProperty("os.name");
        if ( osName.contains("Mac") ) {
            gameLoopThread.run();
        } else {
            gameLoopThread.start();
        }
    }

    @Override
    public void run() {
        try {
            init();
            gameLoop();
        } catch (Exception excp) {
            excp.printStackTrace();
        }
    }

    protected void init() throws Exception {
        window.init();
        timer.init();
        gameLogic.init();
    }

    protected void gameLoop() {
        float elapsedTime;
        float accumulator = 0f;
        float interval = 1f / TARGET_UPS;

        boolean running = true;
        while (running && !window.windowShouldClose()) {
            elapsedTime = timer.getElapsedTime();
            accumulator += elapsedTime;

            input();

            while (accumulator >= interval) {
                update(interval);
                accumulator -= interval;
            }

            render();

            if (!window.isvSync()) {
                sync();
            }
        }
    }

    private void sync() {
        float loopSlot = 1f / TARGET_FPS;
        double endTime = timer.getLastLoopTime() + loopSlot;
        while (timer.getTime() < endTime) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException ie) {
            }
        }
    }

    protected void input() {
        gameLogic.input(window);
    }

    protected void update(float interval) {
        gameLogic.update(interval);
    }

    protected void render() {
        gameLogic.render(window);
        window.update();
    }
}


IGameLogic.java
package org.lwjglb.engine;

public interface IGameLogic {

    void init() throws Exception;

    void input(Window window);

    void update(float interval);
    
    void render(Window window);
}


Window.java
package org.lwjglb.engine;

import static org.lwjgl.glfw.GLFW.*;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.glfw.GLFWVidMode;
import org.lwjgl.opengl.GL;
import static org.lwjgl.opengl.GL11.GL_FALSE;
import static org.lwjgl.opengl.GL11.GL_TRUE;
import static org.lwjgl.opengl.GL11.glClearColor;
import static org.lwjgl.system.MemoryUtil.NULL;

public class Window {

    private final String title;

    private int width;

    private int height;

    private long windowHandle;

    private boolean resized;

    private boolean vSync;

    public Window(String title, int width, int height, boolean vSync) {
        this.title = title;
        this.width = width;
        this.height = height;
        this.vSync = vSync;
        this.resized = false;
    }

    public void init() {
        // Setup an error callback. The default implementation
        // will print the error message in System.err.
        GLFWErrorCallback.createPrint(System.err).set();

        // Initialize GLFW. Most GLFW functions will not work before doing this.
        if (!glfwInit()) {
            throw new IllegalStateException("Unable to initialize GLFW");
        }

        glfwDefaultWindowHints(); // optional, the current window hints are already the default
        glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // the window will stay hidden after creation
        glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // the window will be resizable
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

        // Create the window
        windowHandle = glfwCreateWindow(width, height, title, NULL, NULL);
        if (windowHandle == NULL) {
            throw new RuntimeException("Failed to create the GLFW window");
        }

        // Setup resize callback
        glfwSetFramebufferSizeCallback(windowHandle, (window, width, height) -> {
            this.width = width;
            this.height = height;
            this.setResized(true);
        });

        // Setup a key callback. It will be called every time a key is pressed, repeated or released.
        glfwSetKeyCallback(windowHandle, (window, key, scancode, action, mods) -> {
            if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) {
                glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop
            }
        });

        // Get the resolution of the primary monitor
        GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
        // Center our window
        glfwSetWindowPos(
                windowHandle,
                (vidmode.width() - width) / 2,
                (vidmode.height() - height) / 2
        );

        // Make the OpenGL context current
        glfwMakeContextCurrent(windowHandle);

        if (isvSync()) {
            // Enable v-sync
            glfwSwapInterval(1);
        }

        // Make the window visible
        glfwShowWindow(windowHandle);

        GL.createCapabilities();

        // Set the clear color
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    }

    public void setClearColor(float r, float g, float b, float alpha) {
        glClearColor(r, g, b, alpha);
    }

    public boolean isKeyPressed(int keyCode) {
        return glfwGetKey(windowHandle, keyCode) == GLFW_PRESS;
    }

    public boolean windowShouldClose() {
        return glfwWindowShouldClose(windowHandle);
    }

    public String getTitle() {
        return title;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public boolean isResized() {
        return resized;
    }

    public void setResized(boolean resized) {
        this.resized = resized;
    }

    public boolean isvSync() {
        return vSync;
    }

    public void setvSync(boolean vSync) {
        this.vSync = vSync;
    }

    public void update() {
        glfwSwapBuffers(windowHandle);
        glfwPollEvents();
    }
}


Timmer.java
package org.lwjglb.engine;

public class Timer {

    private double lastLoopTime;
    
    public void init() {
        lastLoopTime = getTime();
    }

    public double getTime() {
        return System.nanoTime() / 1000_000_000.0;
    }

    public float getElapsedTime() {
        double time = getTime();
        float elapsedTime = (float) (time - lastLoopTime);
        lastLoopTime = time;
        return elapsedTime;
    }

    public double getLastLoopTime() {
        return lastLoopTime;
    }
}

この7個のコードをこのように配置することでたぶん動くと思います.
実行結果はなにもない黒い画面が表示され十字キー上でだんだん白くなっていきます

という感じでここから色々改変していって3Dゲームを作れたらいいなと思ってます.

次回はゲームループの解説です.
2.ゲームループ(説明)



2017年11月10日金曜日

eclipseによるLWJGL3のわかりやすい導入方法の備忘録

今回はwindows10のeclipse(oxygen)でLWJGL3の導入についいろいろ調べて調べてたのですが、
日本語の良い記事がなかなか見つからなかったので書き残したいと思います.

今回は環境構築編です。開発編のブログも書いていくので覗いていただければ幸いです。
LWJGL3で3Dゲーム開発のすすめ日記

まずLWJGLのホームページのDOWNLOAD からzipファイルを落としてきます.
https://www.lwjgl.org/download



自分の使用したいAPIをにチェックを入れDOWNLOAD ZIPをクリック
ダウンロードしてきたzipを然るべき(適当な)場所に解凍。


次にeclipseのほうです。いつも通りjavaのプロジェクトを作り,
右クリックでlibraryというフォルダを作成しエクスプローラーから解凍したjarファイルをD&Dでコピーする(コピー後右クリックメニューでリフレッシュを忘れずに)


プロジェクトのプロパティからビルドパスを選択しライブラリータブへ.
JARの追加をクリックして先ほどコピーしてきたlibraryファイルの中身をすべて指定する

OK→適応して閉じる

これでLWJGL3の導入は完了!
最近のアップデートで随分導入がかんたんになりましたね。

あとはLWJGLのホームページからサンプルコードをコピってきて実行して
HellowWorld!!のウィンドウに赤い画面が表示されれば完了です
おつかれさまです

2018/05/22追記
自分でやってみてうまく行かなかったので導入済みのプロジェクトファイルを
dropboxでうpするので使ってあげてください
lwjgl導入済みプロジェクト.zip
↑DropBox直接リンクです



2017年10月20日金曜日

Hump Back - 月まで コード進行

HumpBackの「月まで」のコード進行を耳コピしてみました


Capo3です
使うコードの押さえ方です




もう一歩     足りて なかった

G                  Cadd9

もういっそ   やめてし まいたかった

G                     Cadd9

暮らしの        中の          中で

         Asus4     Dadd9       G



わかってたんだ    遠ざかる

              Cadd9       G

そうだよな       朝が近い

           Dadd9     Em

君はどうだい?

             Cadd9

月くらいなら   迎えに行ったのに

             G           

最終列車を逃したんだ

Dadd9

1番早い 電車に乗るよ

Em                   G



あぁ、なんか  飽きてき たんだ

G                       Cadd9

あぁ、ちょっと  疲れが 溜まってるんだ

G                       Cadd9

暮らしは      良くは   ならな い

       Asus4   Dadd9  Em

髪でも    切り  にいこう  ぜ!

     Asus4  A7sus4 G



わかってたんだ        遠ざかる

              Cadd9       G

そうだよな            君が遠い

           Dadd9     Em

迎えに行くよ   今はどこだい?

            Cadd9       G

朝が近いんだ

G

夢で逢えたら ベイビー

Dadd9

なんて  考える間も無く今日が終わるよ

         Em                         Cadd9



今日が終わるよ

G            Dadd9

君はどうだい? 

Em        Cadd9



G  Dadd9 Em Cadd9

2016年8月4日木曜日

Java3D導入時の 「アクセス制限: The type 'ColorCube' is not API ~~」解決

Java3Dを導入してみてサンプルコードをコピペしてみるが
赤の波線が出る問題.
しかし実行すれば普通にアプレットで実行はできた.

参考にさせてもらったサイト↓

んでもって波線についていろいろ調べてみてもユーザー・ライブラリからパスを通せだの書いてあったけど
そもそもユーザー・ライブラリにはなにも入ってなかったからなにをした良いのやら


実行はできるけど波線が出てるまま開発はちょっと,,,

てことで調べを進めたところ
もっと良い解決策を発見!!


ウィンドウ(W) >> 設定から
java >> コンパイラー >> エラー/警告
を開くと「使用すべきでない制限されたAPI 」があるのでそこをプルダウンして
「使用すべきでないAPIと禁止された参照」のプルダウンメーニューから
無視を選択する
OKを押すとエディタが再起動される
すると赤線が消えてるではないか.


これで開発が始められそう.
お疲れさmsでした




2016年7月4日月曜日

どうしてもC++でwebデータを読み込みたい


ふと為替の自動取引をやりたいなーて思って手始めにhttpからデータの読み込みっと
cppでhtmlをテキストデータで一定時間おきに下記出したいなーって考えて調べに調べて
8時間経過.......

分かったぞ.
c++はネット系に強いって噂をどっかで聞いた覚えがあって調べたところ
標準の"wininet.h"をインクルードしすると
InternetOpen()とInternetOpenUrl()というのが使えるみたいです.

これを使えばいいみたいです.


使い方としてはこんな感じ↓
でもこれはURLがLPTSTR型だからよくわからない.

僕の場合URLを可変にしたいので
できればchar型がありがたい.


そこでこんな感じにしてみた

これだとエラーもなくデバッグできたのだけど一つ問題が,
char型とLPTSTR型は文字コードが違うらしく文字化けてURLがうまく渡されてないみたい.

そこでプロジェぅとのプロパティから
構成プロパティ>全般>文字セット
を「Unicode文字セット」から「マルチバイト文字」に変更するとうまくいくらしい.












うまく行った













これで後はhtmlの内容を読み込んで煮るなり焼くなりご自由にと.

参考までにつかったコード載せときます.
コピペすれば使えると思います.
Source.cpp