QA@IT
«回答へ戻る

5599
     pasori_open
 ```
 
----
+## 実行する
 
 これでソリューションをビルドすると正常にビルドされ、qait_sample入りのfelicalib.dllが出来上がります。
 (たぶん src\debugディレクトリにいます。)
 ```
 
 「エラー:DLLが正しく呼び出せません。」になりませんでしたか?
+
+## 修正して再度実行する
 
 エラーになることが分かったら、コードを 2か所修正します。
 felicalib.h と felicalib.c の `int qait_sample(int a, int b)` の intと qait_sampleの間に `__stdcall`を追加します。

解決済みですが、少し気になっている点があるので追記します。

stdcall と cdecl

そもそも私がVB6から使えませんよと言ったところです。
前提の話としてこれを説明します。
(「こう書くとこうなる」を示すだけで理解する必要はありません)

felicalib 4.2のソースを元にお話しします。
もしVS2008があるならビルド可能だと思いますので実際に実行してみるとわかりやすいかもしれません。

あたらしい関数を追加してみる

いきなりですが、もともとの関数を使うのは面倒なので、簡単な関数を足してしまいます。
といっても追加するのは10行程度で済みますので心配しなくても大丈夫です。

なお、環境は32bit環境として書いています。

felicalib.h

まず関数の宣言を1行追加します。前後の行は省略してます。
数値を二つうけとって、数値を返す関数です。(intなのでVB6ではLong, VB.NETではIntegerです。)

/* APIs */
#ifdef __cplusplus
extern "C" {
#endif

int qait_sample(int a, int b);  /* この行を追加 */

pasori *pasori_open(char *);

felicalib.c

実際のコードを追加します。

#include <stdio.h>

int qait_sample(int a, int b){  /* この3行を追加 */
  return a - b;
}

/**
   @brief PaSoRi をオープンする

felicalib.def

最後に公開する関数にqait_sampleを追加します。
EXPORTSの次の行に追加されています。

LIBRARY "felicalib"

EXPORTS
    qait_sample
    pasori_open

実行する

これでソリューションをビルドすると正常にビルドされ、qait_sample入りのfelicalib.dllが出来上がります。
(たぶん src\debugディレクトリにいます。)

このDLLをパスが通るディレクトリに置き、VBAかVB6で以下を実行してみましょう。

Private Declare Function qait_sample Lib "felicalib.dll" (ByVal a As Long, ByVal b As Long) As Long

Private Sub Command1_Click()
  Debug.Print qait_sample(9,2)
End Sub

「エラー:DLLが正しく呼び出せません。」になりませんでしたか?

修正して再度実行する

エラーになることが分かったら、コードを 2か所修正します。
felicalib.h と felicalib.c の int qait_sample(int a, int b) の intと qait_sampleの間に __stdcallを追加します。

.h

int __stdcall qait_sample(int a, int b);  /* この行を追加 */

.c

int __stdcall qait_sample(int a, int b){  /* この3行を追加 */

これでビルドしなおして、dllファイルを置き換えて、再度VBA(VB6)を実行します。
今度は実行できたと思います。

これがとてもざっくりした呼出規約 cdeclとstdcallの違いです。
VB6のDeclare Functionはstdcallのものを呼び出すようになっています。

cdeclのものとはメモリ解放のルールが異なるので、仮に cdeclのものが呼べてしまった場合もスタックポインタがおかしくなるとか不都合があるので普通やってはいけません。
今回では __stdcallをつけてないのが cdeclで __stdcallを付けた方が stdcallですね。

細かい事言えばいろいろあるんですけど(別名とかもあるし)ここではとりあえず、
VB6で呼びたければ stdcallが必要でしたが、felicalibは cdeclっぽい(だからVB6から使えない)です。
という事です。

長くなってすいませんが続きの気になることはまた回答起こします。
もう残りはそんなに長くないです(笑)

解決済みですが、少し気になっている点があるので追記します。


# stdcall と cdecl

そもそも私がVB6から使えませんよと言ったところです。
前提の話としてこれを説明します。
(「こう書くとこうなる」を示すだけで理解する必要はありません)

felicalib 4.2のソースを元にお話しします。
もしVS2008があるならビルド可能だと思いますので実際に実行してみるとわかりやすいかもしれません。

## あたらしい関数を追加してみる

いきなりですが、もともとの関数を使うのは面倒なので、簡単な関数を足してしまいます。
といっても追加するのは10行程度で済みますので心配しなくても大丈夫です。

なお、環境は32bit環境として書いています。

**felicalib.h**

まず関数の宣言を1行追加します。前後の行は省略してます。
数値を二つうけとって、数値を返す関数です。(intなのでVB6ではLong, VB.NETではIntegerです。)

```cpp
/* APIs */
#ifdef __cplusplus
extern "C" {
#endif

int qait_sample(int a, int b);  /* この行を追加 */

pasori *pasori_open(char *);
```

**felicalib.c**

実際のコードを追加します。

```cpp
#include <stdio.h>

int qait_sample(int a, int b){  /* この3行を追加 */
  return a - b;
}

/**
   @brief PaSoRi をオープンする
```

**felicalib.def**

最後に公開する関数にqait_sampleを追加します。
EXPORTSの次の行に追加されています。

```
LIBRARY	"felicalib"

EXPORTS
    qait_sample
    pasori_open
```

## 実行する

これでソリューションをビルドすると正常にビルドされ、qait_sample入りのfelicalib.dllが出来上がります。
(たぶん src\debugディレクトリにいます。)

このDLLをパスが通るディレクトリに置き、VBAかVB6で以下を実行してみましょう。

```
Private Declare Function qait_sample Lib "felicalib.dll" (ByVal a As Long, ByVal b As Long) As Long

Private Sub Command1_Click()
  Debug.Print qait_sample(9,2)
End Sub
```

「エラー:DLLが正しく呼び出せません。」になりませんでしたか?

## 修正して再度実行する

エラーになることが分かったら、コードを 2か所修正します。
felicalib.h と felicalib.c の `int qait_sample(int a, int b)` の intと qait_sampleの間に `__stdcall`を追加します。

.h
```
int __stdcall qait_sample(int a, int b);  /* この行を追加 */
```

.c
```
int __stdcall qait_sample(int a, int b){  /* この3行を追加 */
```

これでビルドしなおして、dllファイルを置き換えて、再度VBA(VB6)を実行します。
今度は実行できたと思います。

これがとてもざっくりした呼出規約 cdeclとstdcallの違いです。
VB6のDeclare Functionはstdcallのものを呼び出すようになっています。


cdeclのものとはメモリ解放のルールが異なるので、仮に cdeclのものが呼べてしまった場合もスタックポインタがおかしくなるとか不都合があるので普通やってはいけません。
今回では __stdcallをつけてないのが cdeclで __stdcallを付けた方が stdcallですね。

細かい事言えばいろいろあるんですけど(別名とかもあるし)ここではとりあえず、
VB6で呼びたければ stdcallが必要でしたが、felicalibは cdeclっぽい(だからVB6から使えない)です。
という事です。

長くなってすいませんが続きの気になることはまた回答起こします。
もう残りはそんなに長くないです(笑)

5599
     pasori_open
 ```
 
+---
 
-途中ですがいったん投稿します
+これでソリューションをビルドすると正常にビルドされ、qait_sample入りのfelicalib.dllが出来上がります。
+(たぶん src\debugディレクトリにいます。)
+
+このDLLをパスが通るディレクトリに置き、VBAかVB6で以下を実行してみましょう。
+
+```
+Private Declare Function qait_sample Lib "felicalib.dll" (ByVal a As Long, ByVal b As Long) As Long
+
+Private Sub Command1_Click()
+  Debug.Print qait_sample(9,2)
+End Sub
+```
+
+「エラー:DLLが正しく呼び出せません。」になりませんでしたか?
+
+エラーになることが分かったら、コードを 2か所修正します。
+felicalib.h と felicalib.c の `int qait_sample(int a, int b)` の intと qait_sampleの間に `__stdcall`を追加します。
+
+.h
+```
+int __stdcall qait_sample(int a, int b);  /* この行を追加 */
+```
+
+.c
+```
+int __stdcall qait_sample(int a, int b){  /* この3行を追加 */
+```
+
+これでビルドしなおして、dllファイルを置き換えて、再度VBA(VB6)を実行します。
+今度は実行できたと思います。
+
+これがとてもざっくりした呼出規約 cdeclとstdcallの違いです。
+VB6のDeclare Functionはstdcallのものを呼び出すようになっています。
+
+
+cdeclのものとはメモリ解放のルールが異なるので、仮に cdeclのものが呼べてしまった場合もスタックポインタがおかしくなるとか不都合があるので普通やってはいけません。
+今回では __stdcallをつけてないのが cdeclで __stdcallを付けた方が stdcallですね。
+
+細かい事言えばいろいろあるんですけど(別名とかもあるし)ここではとりあえず、
+VB6で呼びたければ stdcallが必要でしたが、felicalibは cdeclっぽい(だからVB6から使えない)です。
+という事です。
+
+長くなってすいませんが続きの気になることはまた回答起こします。
+もう残りはそんなに長くないです(笑)

解決済みですが、少し気になっている点があるので追記します。

stdcall と cdecl

そもそも私がVB6から使えませんよと言ったところです。
前提の話としてこれを説明します。
(「こう書くとこうなる」を示すだけで理解する必要はありません)

felicalib 4.2のソースを元にお話しします。
もしVS2008があるならビルド可能だと思いますので実際に実行してみるとわかりやすいかもしれません。

あたらしい関数を追加してみる

いきなりですが、もともとの関数を使うのは面倒なので、簡単な関数を足してしまいます。
といっても追加するのは10行程度で済みますので心配しなくても大丈夫です。

なお、環境は32bit環境として書いています。

felicalib.h

まず関数の宣言を1行追加します。前後の行は省略してます。
数値を二つうけとって、数値を返す関数です。(intなのでVB6ではLong, VB.NETではIntegerです。)

/* APIs */
#ifdef __cplusplus
extern "C" {
#endif

int qait_sample(int a, int b);  /* この行を追加 */

pasori *pasori_open(char *);

felicalib.c

実際のコードを追加します。

#include <stdio.h>

int qait_sample(int a, int b){  /* この3行を追加 */
  return a - b;
}

/**
   @brief PaSoRi をオープンする

felicalib.def

最後に公開する関数にqait_sampleを追加します。
EXPORTSの次の行に追加されています。

LIBRARY "felicalib"

EXPORTS
    qait_sample
    pasori_open

これでソリューションをビルドすると正常にビルドされ、qait_sample入りのfelicalib.dllが出来上がります。
(たぶん src\debugディレクトリにいます。)

このDLLをパスが通るディレクトリに置き、VBAかVB6で以下を実行してみましょう。

Private Declare Function qait_sample Lib "felicalib.dll" (ByVal a As Long, ByVal b As Long) As Long

Private Sub Command1_Click()
  Debug.Print qait_sample(9,2)
End Sub

「エラー:DLLが正しく呼び出せません。」になりませんでしたか?

エラーになることが分かったら、コードを 2か所修正します。
felicalib.h と felicalib.c の int qait_sample(int a, int b) の intと qait_sampleの間に __stdcallを追加します。

.h

int __stdcall qait_sample(int a, int b);  /* この行を追加 */

.c

int __stdcall qait_sample(int a, int b){  /* この3行を追加 */

これでビルドしなおして、dllファイルを置き換えて、再度VBA(VB6)を実行します。
今度は実行できたと思います。

これがとてもざっくりした呼出規約 cdeclとstdcallの違いです。
VB6のDeclare Functionはstdcallのものを呼び出すようになっています。

cdeclのものとはメモリ解放のルールが異なるので、仮に cdeclのものが呼べてしまった場合もスタックポインタがおかしくなるとか不都合があるので普通やってはいけません。
今回では __stdcallをつけてないのが cdeclで __stdcallを付けた方が stdcallですね。

細かい事言えばいろいろあるんですけど(別名とかもあるし)ここではとりあえず、
VB6で呼びたければ stdcallが必要でしたが、felicalibは cdeclっぽい(だからVB6から使えない)です。
という事です。

長くなってすいませんが続きの気になることはまた回答起こします。
もう残りはそんなに長くないです(笑)

解決済みですが、少し気になっている点があるので追記します。


# stdcall と cdecl

そもそも私がVB6から使えませんよと言ったところです。
前提の話としてこれを説明します。
(「こう書くとこうなる」を示すだけで理解する必要はありません)

felicalib 4.2のソースを元にお話しします。
もしVS2008があるならビルド可能だと思いますので実際に実行してみるとわかりやすいかもしれません。

## あたらしい関数を追加してみる

いきなりですが、もともとの関数を使うのは面倒なので、簡単な関数を足してしまいます。
といっても追加するのは10行程度で済みますので心配しなくても大丈夫です。

なお、環境は32bit環境として書いています。

**felicalib.h**

まず関数の宣言を1行追加します。前後の行は省略してます。
数値を二つうけとって、数値を返す関数です。(intなのでVB6ではLong, VB.NETではIntegerです。)

```cpp
/* APIs */
#ifdef __cplusplus
extern "C" {
#endif

int qait_sample(int a, int b);  /* この行を追加 */

pasori *pasori_open(char *);
```

**felicalib.c**

実際のコードを追加します。

```cpp
#include <stdio.h>

int qait_sample(int a, int b){  /* この3行を追加 */
  return a - b;
}

/**
   @brief PaSoRi をオープンする
```

**felicalib.def**

最後に公開する関数にqait_sampleを追加します。
EXPORTSの次の行に追加されています。

```
LIBRARY	"felicalib"

EXPORTS
    qait_sample
    pasori_open
```

---

これでソリューションをビルドすると正常にビルドされ、qait_sample入りのfelicalib.dllが出来上がります。
(たぶん src\debugディレクトリにいます。)

このDLLをパスが通るディレクトリに置き、VBAかVB6で以下を実行してみましょう。

```
Private Declare Function qait_sample Lib "felicalib.dll" (ByVal a As Long, ByVal b As Long) As Long

Private Sub Command1_Click()
  Debug.Print qait_sample(9,2)
End Sub
```

「エラー:DLLが正しく呼び出せません。」になりませんでしたか?

エラーになることが分かったら、コードを 2か所修正します。
felicalib.h と felicalib.c の `int qait_sample(int a, int b)` の intと qait_sampleの間に `__stdcall`を追加します。

.h
```
int __stdcall qait_sample(int a, int b);  /* この行を追加 */
```

.c
```
int __stdcall qait_sample(int a, int b){  /* この3行を追加 */
```

これでビルドしなおして、dllファイルを置き換えて、再度VBA(VB6)を実行します。
今度は実行できたと思います。

これがとてもざっくりした呼出規約 cdeclとstdcallの違いです。
VB6のDeclare Functionはstdcallのものを呼び出すようになっています。


cdeclのものとはメモリ解放のルールが異なるので、仮に cdeclのものが呼べてしまった場合もスタックポインタがおかしくなるとか不都合があるので普通やってはいけません。
今回では __stdcallをつけてないのが cdeclで __stdcallを付けた方が stdcallですね。

細かい事言えばいろいろあるんですけど(別名とかもあるし)ここではとりあえず、
VB6で呼びたければ stdcallが必要でしたが、felicalibは cdeclっぽい(だからVB6から使えない)です。
という事です。

長くなってすいませんが続きの気になることはまた回答起こします。
もう残りはそんなに長くないです(笑)

回答を投稿

解決済みですが、少し気になっている点があるので追記します。

stdcall と cdecl

そもそも私がVB6から使えませんよと言ったところです。
前提の話としてこれを説明します。
(「こう書くとこうなる」を示すだけで理解する必要はありません)

felicalib 4.2のソースを元にお話しします。
もしVS2008があるならビルド可能だと思いますので実際に実行してみるとわかりやすいかもしれません。

あたらしい関数を追加してみる

いきなりですが、もともとの関数を使うのは面倒なので、簡単な関数を足してしまいます。
といっても追加するのは10行程度で済みますので心配しなくても大丈夫です。

なお、環境は32bit環境として書いています。

felicalib.h

まず関数の宣言を1行追加します。前後の行は省略してます。
数値を二つうけとって、数値を返す関数です。(intなのでVB6ではLong, VB.NETではIntegerです。)

/* APIs */
#ifdef __cplusplus
extern "C" {
#endif

int qait_sample(int a, int b);  /* この行を追加 */

pasori *pasori_open(char *);

felicalib.c

実際のコードを追加します。

#include <stdio.h>

int qait_sample(int a, int b){  /* この3行を追加 */
  return a - b;
}

/**
   @brief PaSoRi をオープンする

felicalib.def

最後に公開する関数にqait_sampleを追加します。
EXPORTSの次の行に追加されています。

LIBRARY "felicalib"

EXPORTS
    qait_sample
    pasori_open

途中ですがいったん投稿します

解決済みですが、少し気になっている点があるので追記します。


# stdcall と cdecl

そもそも私がVB6から使えませんよと言ったところです。
前提の話としてこれを説明します。
(「こう書くとこうなる」を示すだけで理解する必要はありません)

felicalib 4.2のソースを元にお話しします。
もしVS2008があるならビルド可能だと思いますので実際に実行してみるとわかりやすいかもしれません。

## あたらしい関数を追加してみる

いきなりですが、もともとの関数を使うのは面倒なので、簡単な関数を足してしまいます。
といっても追加するのは10行程度で済みますので心配しなくても大丈夫です。

なお、環境は32bit環境として書いています。

**felicalib.h**

まず関数の宣言を1行追加します。前後の行は省略してます。
数値を二つうけとって、数値を返す関数です。(intなのでVB6ではLong, VB.NETではIntegerです。)

```cpp
/* APIs */
#ifdef __cplusplus
extern "C" {
#endif

int qait_sample(int a, int b);  /* この行を追加 */

pasori *pasori_open(char *);
```

**felicalib.c**

実際のコードを追加します。

```cpp
#include <stdio.h>

int qait_sample(int a, int b){  /* この3行を追加 */
  return a - b;
}

/**
   @brief PaSoRi をオープンする
```

**felicalib.def**

最後に公開する関数にqait_sampleを追加します。
EXPORTSの次の行に追加されています。

```
LIBRARY	"felicalib"

EXPORTS
    qait_sample
    pasori_open
```


途中ですがいったん投稿します