HAMLOG開発室は、HAMLOGに関連したプログラム開発(C、パスカル、VB言語等、又はDLL)についての
専用BBSです。プログラム言語に関する投稿以外は通常のHAMLOG相談室に投稿して下さい。
HAMLOG開発室BBS

Re: VC++ Run-Time Check Failure #0 投稿者:JO1SIM・出島

でしまです。

Netには__stdcallを指定すると extern "C"が利かなくなるというような書き込みもありますね・・・。ただ、extern "C" + __stdcallの構造はwindows.hとまったく同じなので、その中にヒントがあるかもしれません。

WinGDI.h等を見ると
extern "C"
{__declspec(dllimport) int __stdcall THW_update(...)}

と等価のような書きぶりのようです。(要は「全部つける」?)
「dllimport」の部分はDEFファイルを使っての解決することと同義かと思います。

動的リンクの場合のポインタの保管ですが、私のところではHamlog50.dllについてはLoadLibraryしてからFreeLibraryするまでの間で関数のポインタを保持しておいてもうまく動いてます。(THW2VBNET.DLLの場合では都度GetProcAddressしてますが…)



> >
> > JO1SIM出島です。
> > CWでお世話になっています!!!
> 最近ご無沙汰ですね。相変わらずCWでAJA追っかけ中です。
>
> >
> > コンパイルのオプションのお話から察するに、VS2013(Express for Windows Desktop?)でWin32プラットフォームの開発状態であると思いますのでその前提でお話しします。
> >
> > 動的リンクで成功するということですので、やはり呼び出し規則だけの問題だと思います。コンパイルオプションではなく、呼び出す関数だけ…
> >
> > extern "C"
> > { int __stdcall THW_read(TThLog *,...);
> > :};
> >
> >
> > みたいな宣言ではダメでしょうか? extern "C" は関数名のみで名前
> >を解決するために必要で、__stdcallは hamlog50.h にWINAPIとして>義>してある通り、APIのコール方法を規定してます。
> 仮のLibを作る際にも同じ指定を行い、使用する際にも指定しないと、リンクの際にエラーが出ます。__stdcall を指定すると extern "C"を付けても名前修飾が付くんですね。__cdeclではこれを付けると名前修飾が付かない。
>
> > .
> > ..そういう私もDLLが呼び出せないときを想定し、動的リンクで呼び出してますが…。
> 皆さん有難うございます。
> やはり、__stdcall でしたか。だけどこれを指定すると、 extern "C"を指定しても、_XXXXX@ の名前修飾が付き解決出来ませんでした。depends で見るとLink状況が確認できますので。結局動的リンクで皆さん運用しているのですね。引数のない関数 Verチェックは問題なく 動くので引数の受け渡しの問題だと思っていたのですが。皆さん動的で行っておられるならこれで行きます。それにしてもなぜこちらだといけるのかな。
>  動的リンクの場合 ポインターを保存しても駄目だと言う事が書いてあるので使用の際にDLL 関数のポインターを新たに取得していますが、やはり一つのサブルーチン内だけで使へと言う事ですかね。初期化で一括ポインターを取得して、あちこちで使えれば、普通のリンクと同じで使いやすいのですが。皆さんアドバイス有難うございました。

2014/10/01(Wed) 21:46:21  [No.583]


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)
- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)
Call 名前 ※必須
文字色
Eメール
タイトル sage
URL
メッセージ 手動改行 強制改行 図表モード
メッセージには上記と同じURLを書き込まないで下さい
画像File  (130kBまで)
暗証キー (英数字で8文字以内)
投稿キー (投稿時 投稿キー を入力してください)
プレビュー