いつもお世話になっています。
今回、初めてDLLを作ることになりました。
で、社内からの要望が、「VC++、VB、Access VBA、Excel VBAのどこからで
も利用可能」というわがままな依頼になっています。
開発環境は、WinXP + VC++ .net 2003 Enterprise、DLLを利用するプログ
ラムはVB・VC++は.net 2003、Office系はOffice 2003 Enterpriseです。
とりあえず、VCで利用できる簡単なDLLを作ってみました。
以下がソースです(とりあえず動けばよかったのでかなり適当に作ってい
ますが・・・)
#include<windows.h>
#define DllExport __declspec(dllexport)
DllExport long __stdcall StringFunc(char *strInput, long lenInput, char **strOutput, long *lenOutput);
DllExport long __stdcall StringFunc(char *strInput, long lenInput, char **strOutput, long *lenOutput)
{
if(strInput == NULL || lenInput == 0)
{
if(*strOutput != NULL)
{
delete[] strOutput;
strOutput = NULL;
}
lenOutput = 0;
return 99;
}
if(*strOutput != NULL)
{
delete[] *strOutput;
*strOutput = NULL;
}
*lenOutput = lenInput + 16;
*strOutput = new char[(size_t)(*lenOutput + 1)];
if(strOutput == NULL)
{
*lenOutput = 0;
return 98;
}
strncpy(*strOutput, strInput, lenInput);
strncat(*strOutput, "(test用追加)", (size_t)(*lenOutput - lenInput - 1));
//バグ防止のため、最後にNULL文字を追加
strOutput[*lenOutput - 1] = '\0';
*lenOutput = (long)strlen(*strOutput);
return 0;
}
こんな感じです。
この関数は、引数も戻り値も、ほぼ実際に作りたい関数を想定して作りま
した(基本的にはある文字列をいじって変更した文字列を取得したいだけ
です)。
このままDLLをVBやAccessから読み込むと、不正なエラーでAcceessが終了
してしまったり、VBでは「'System.Security.SecurityException' のハン
ドルされていない例外が system.windows.forms.dll で発生しました。
追加情報 : System.Security.Permissions.SecurityPermission」とでて
しまいました。
そもそもVBやVBAでも利用できるようなDLLはVC++で作成可能なのでしょう
か?
また、その際の約束ごとや注意事項等が有るのであればご教授いただけな
いでしょうか?
参考になるURLだけでも結構です。
漠然とした質問愛用で申し訳有りませんが、よろしくおねがいいたします。
とりあえず、(VC++の)過去ログをVBをキーに検索してみてください。
BSTRやらVARIANTやらというキーワードが現れると思います。
ちなみにVBはVB.NETですか?
この形式のDLLはクラスライブラリではないので
DllImportsまたはDeclare出しか使えません。(参照設定では使えない)
Blueさん
早速のご返答ありがとうございます。
> BSTRやらVARIANTやらというキーワードが現れると思います。
なるほど・・・変数の型に関しては制約と言うか、しばりがあるみたいですね・・・
> ちなみにVBはVB.NETですか?
> この形式のDLLはクラスライブラリではないので
> DllImportsまたはDeclare出しか使えません。(参照設定では使えない)
おっしゃるとおり、VB.NETですが、Blueさんのおっしゃるとおり「DllImports
またはDeclare」を使うつもりです。
もう少し過去ログを見てみます。
Blueさん
本当にありがとうございました。
BSTRに関するところと、後は私のVB系の知識不足(ByBalとByRefあたり値渡しと参照渡しがわかっていなかった)が原因でした。
無事、基本的な部分は動作できるようになりました。
ツイート | ![]() |